XML-jäsennys Pythonissa

XML-jäsennys Pythonissa
Tämä artikkeli keskittyy siihen, kuinka voit jäsentää tietyn XML-tiedoston ja poimia siitä hyödyllisiä tietoja jäsennellyllä tavalla. XML: XML tulee sanoista eXtensible Markup Language. Se on suunniteltu tallentamaan ja siirtämään tietoja. Se on suunniteltu sekä ihmisten että koneellisesti luettavaksi. Siksi XML:n suunnittelutavoitteet korostavat yksinkertaisuutta, yleisyyttä ja käytettävyyttä Internetissä. Tässä opetusohjelmassa jäsennettävä XML-tiedosto on itse asiassa RSS-syöte. RSS: RSS (Rich Site Summary, jota usein kutsutaan nimellä Really Simple Syndication) käyttää tavallisia verkkosyötemuotoja julkaistakseen usein päivitettyjä tietoja, kuten blogimerkintöjä uutisotsikoiden äänivideoita. RSS on XML-muotoiltu pelkkää tekstiä.
  • Itse RSS-muoto on suhteellisen helppolukuinen sekä automatisoitujen prosessien että ihmisten kannalta.
  • Tässä opetusohjelmassa käsitelty RSS on suositun uutissivuston suosituimpien uutisten RSS-syöte. Voit tarkistaa sen tässä . Tavoitteemme on käsitellä tämä RSS-syöte (tai XML-tiedosto) ja tallentaa se johonkin muuhun muotoon tulevaa käyttöä varten.
Käytetty Python-moduuli: Tämä artikkeli keskittyy sisäänrakennetun käyttöjärjestelmän käyttöön xml python-moduuli XML:n jäsentämiseen ja pääpaino on ElementTree XML API tästä moduulista. Toteutus: Python
   #Python code to illustrate parsing of XML files   # importing the required modules   import   csv   import   requests   import   xml.etree.ElementTree   as   ET   def   loadRSS  ():   # url of rss feed   url   =   'http://www.hindustantimes.com/rss/topnews/rssfeed.xml'   # creating HTTP response object from given url   resp   =   requests  .  get  (  url  )   # saving the xml file   with   open  (  'topnewsfeed.xml'     'wb'  )   as   f  :   f  .  write  (  resp  .  content  )   def   parseXML  (  xmlfile  ):   # create element tree object   tree   =   ET  .  parse  (  xmlfile  )   # get root element   root   =   tree  .  getroot  ()   # create empty list for news items   newsitems   =   []   # iterate news items   for   item   in   root  .  findall  (  './channel/item'  ):   # empty news dictionary   news   =   {}   # iterate child elements of item   for   child   in   item  :   # special checking for namespace object content:media   if   child  .  tag   ==   '{https://video.search.yahoo.com/mrss'  :   news  [  'media'  ]   =   child  .  attrib  [  'url'  ]   else  :   news  [  child  .  tag  ]   =   child  .  text  .  encode  (  'utf8'  )   # append news dictionary to news items list   newsitems  .  append  (  news  )   # return news items list   return   newsitems   def   savetoCSV  (  newsitems     filename  ):   # specifying the fields for csv file   fields   =   [  'guid'     'title'     'pubDate'     'description'     'link'     'media'  ]   # writing to csv file   with   open  (  filename     'w'  )   as   csvfile  :   # creating a csv dict writer object   writer   =   csv  .  DictWriter  (  csvfile     fieldnames   =   fields  )   # writing headers (field names)   writer  .  writeheader  ()   # writing data rows   writer  .  writerows  (  newsitems  )   def   main  ():   # load rss from web to update existing xml file   loadRSS  ()   # parse xml file   newsitems   =   parseXML  (  'topnewsfeed.xml'  )   # store news items in a csv file   savetoCSV  (  newsitems     'topnews.csv'  )   if   __name__   ==   '__main__'  :   # calling main function   main  ()   
Above code will:
  • Lataa RSS-syöte määritetystä URL-osoitteesta ja tallenna se XML-tiedostona.
  • Jäsennä XML-tiedosto tallentaaksesi uutiset sanakirjaluettelona, ​​jossa jokainen sanakirja on yksittäinen uutinen.
  • Tallenna uutiset CSV-tiedostoon.
Yritetään ymmärtää koodi osiin:
    Ladataan ja tallennetaan RSS-syötettä
    def loadRSS(): # url of rss feed url = 'http://www.hindustantimes.com/rss/topnews/rssfeed.xml' # creating HTTP response object from given url resp = requests.get(url) # saving the xml file with open('topnewsfeed.xml' 'wb') as f: f.write(resp.content) 
    Here we first created a HTTP response object by sending an HTTP request to the URL of the RSS feed. The content of response now contains the XML file data which we save as topnewsfeed.xml paikallisessa hakemistossamme. Saat lisätietoja pyyntömoduulin toiminnasta seuraamalla tätä artikkelia: HANKI- ja POST-pyynnöt Pythonilla Jäsennetään XML:ää Olemme luoneet parseXML() toiminto jäsentää XML-tiedoston. Tiedämme, että XML on luonnostaan ​​hierarkkinen tietomuoto ja luonnollisin tapa esittää se on puu. Katso esimerkiksi alla olevaa kuvaa: jäsentää XML Täällä käytämme xml.etree.ElementTree (kutsu sitä lyhyesti ET) -moduuli. Element Treessä on kaksi luokkaa tätä tarkoitusta varten - ElementTree edustaa koko XML-dokumenttia puuna ja Elementti edustaa yhtä solmua tässä puussa. Vuorovaikutus koko asiakirjan kanssa (tiedostoihin lukeminen ja tiedostoista kirjoittaminen) tehdään yleensä tiedostossa ElementTree taso. Vuorovaikutus yhden XML-elementin ja sen alielementtien kanssa tehdään Elementti taso. Okei, käydään läpi parseXML() function now:
    tree = ET.parse(xmlfile) 
    Here we create an ElementTree objekti jäsentämällä hyväksytty xml-tiedosto.
    root = tree.getroot() 
    juurtunut () funktio palauttaa juuren puu kuten an Elementti object.
    for item in root.findall('./channel/item'): 
    Now once you have taken a look at the structure of your XML file you will notice that we are interested only in kohde elementti. ./channel/item on itse asiassa XPath syntaksi (XPath on kieli, jolla osoitetaan XML-asiakirjan osia). Täältä haluamme löytää kaikki kohde lapsenlapset kanava lapset juuri (merkitty '.') -elementtiä. Voit lukea lisää tuetuista XPath-syntaksista tässä .
    for item in root.findall('./channel/item'): # empty news dictionary news = {} # iterate child elements of item for child in item: # special checking for namespace object content:media if child.tag == '{https://video.search.yahoo.com/mrss': news['media'] = child.attrib['url'] else: news[child.tag] = child.text.encode('utf8') # append news dictionary to news items list newsitems.append(news) 
    Now we know that we are iterating through kohde elementtejä, joissa jokainen kohde elementti sisältää yhden uutisen. Joten luomme tyhjän uutiset dictionary in which we will store all data available about news item. To iterate though each child element of an element we simply iterate through it like this:
    for child in item: 
    Now notice a sample item element here: XML-jäsennys Pythonissa We will have to handle namespace tags separately as they get expanded to their original value when parsed. So we do something like this:
    if child.tag == '{https://video.search.yahoo.com/mrss': news['media'] = child.attrib['url'] 
    lapsi.attrib on sanakirja kaikista elementtiin liittyvistä määritteistä. Täällä olemme kiinnostuneita url ominaisuus media:sisältö namespace tag. Now for all other children we simply do:
    news[child.tag] = child.text.encode('utf8') 
    lapsi.tunniste sisältää lapsielementin nimen. lapsi.teksti stores all the text inside that child element. So finally a sample item element is converted to a dictionary and looks like this:
    {'description': 'Ignis has a tough competition already from Hyun....  'guid': 'http://www.hindustantimes.com/autos/maruti-ignis-launch....  'link': 'http://www.hindustantimes.com/autos/maruti-ignis-launch....  'media': 'http://www.hindustantimes.com/rf/image_size_630x354/HT/...  'pubDate': 'Thu 12 Jan 2017 12:33:04 GMT ' 'title': 'Maruti Ignis launches on Jan 13: Five cars that threa..... } 
    Then we simply append this dict element to the list uutissivustoja . Lopulta tämä lista palautetaan. Tietojen tallentaminen CSV-tiedostoon Nyt vain tallennamme uutisluettelon CSV-tiedostoon, jotta sitä voidaan käyttää tai muokata helposti jatkossa tallenna CSV:hen() toiminto. Saat lisätietoja sanakirjaelementtien kirjoittamisesta CSV-tiedostoon tämän artikkelin kautta: Työskentely CSV-tiedostojen kanssa Pythonissa
Joten nyt tältä muotoiltu tietomme näyttää nyt: tulos Kuten näette, hierarkkisen XML-tiedoston tiedot on muunnettu yksinkertaiseksi CSV-tiedostoksi niin, että kaikki uutiset tallennetaan taulukon muodossa. Tämä helpottaa myös tietokannan laajentamista. Voit myös käyttää JSON-tyyppistä dataa suoraan sovelluksissaan! Tämä on paras vaihtoehto tietojen poimimiseen verkkosivustoilta, jotka eivät tarjoa julkista APIa, mutta tarjoavat joitain RSS-syötteitä. Kaikki yllä olevassa artikkelissa käytetyt koodit ja tiedostot löytyvät tässä . Mitä seuraavaksi?
  • Voit katsoa lisää rss-syötteitä yllä olevassa esimerkissä käytetystä uutissivustosta. Voit yrittää luoda laajennetun version yllä olevasta esimerkistä jäsentämällä myös muita RSS-syötteitä.
  • Oletko krikettifani? Sitten tämä RSS-syötteen täytyy kiinnostaa sinua! Voit jäsentää tämän XML-tiedoston raaputtaaksesi tietoja live-krikettiotteluista ja käyttää sitä työpöydän ilmoituksen tekemiseen!
HTML- ja XML-tietovisa Luo tietokilpailu