Parsovanie XML v Pythone

Parsovanie XML v Pythone
Tento článok sa zameriava na to, ako možno analyzovať daný súbor XML a extrahovať z neho niektoré užitočné údaje štruktúrovaným spôsobom. XML: XML je skratka pre eXtensible Markup Language. Bol navrhnutý na ukladanie a prenos dát. Bol navrhnutý tak, aby bol čitateľný človekom aj strojom. Preto ciele návrhu XML zdôrazňujú jednoduchosť, všeobecnosť a použiteľnosť na internete. Súbor XML, ktorý sa má analyzovať v tomto návode, je v skutočnosti informačný kanál RSS. RSS: RSS (Rich Site Summary často nazývané Really Simple Syndication) používa rodinu štandardných formátov webových informačných kanálov na publikovanie často aktualizovaných informácií, ako sú napríklad záznamy blogov, titulky správ, audio video. RSS je obyčajný text vo formáte XML.
  • Samotný formát RSS je pomerne ľahko čitateľný ako pre automatizované procesy, tak aj pre ľudí.
  • RSS spracované v tomto návode je informačný kanál RSS s hlavnými správami z populárneho spravodajského webu. Môžete to skontrolovať tu . Naším cieľom je spracovať tento RSS kanál (alebo súbor XML) a uložiť ho v inom formáte pre budúce použitie.
Použitý modul Python: Tento článok sa zameria na používanie vstavaných xml modul v pythone na analýzu XML a hlavný dôraz bude kladený na ElementTree XML API tohto modulu. Implementácia: 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:
  • Načítajte kanál RSS zo zadanej adresy URL a uložte ho ako súbor XML.
  • Analyzujte súbor XML, aby ste uložili novinky ako zoznam slovníkov, kde každý slovník predstavuje jednu novinku.
  • Uložte novinky do súboru CSV.
Pokúsme sa porozumieť kódu po častiach:
    Načítavanie a ukladanie RSS kanála
    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 v našom miestnom adresári. Ďalšie informácie o tom, ako modul žiadostí funguje, nájdete v tomto článku: Žiadosti GET a POST pomocou Pythonu Analýza XML Vytvorili sme parseXML() funkcia na analýzu súboru XML. Vieme, že XML je vo svojej podstate hierarchický dátový formát a najprirodzenejším spôsobom, ako ho reprezentovať, je strom. Pozrite si napríklad obrázok nižšie: parsovanie XML Tu používame xml.etree.ElementTree (skrátene to nazývame ET) modul. Element Tree má na tento účel dve triedy - ElementTree predstavuje celý XML dokument ako strom a Prvok predstavuje jeden uzol v tomto strome. Interakcie s celým dokumentom (čítanie a zápis do/zo súborov) sa zvyčajne vykonávajú na ElementTree úrovni. Interakcie s jedným prvkom XML a jeho podprvkami sa vykonávajú na Prvok úrovni. Ok, tak poďme cez parseXML() function now:
    tree = ET.parse(xmlfile) 
    Here we create an ElementTree objekt analyzovaním odovzdaného xmlfile.
    root = tree.getroot() 
    zakorenený() funkcia vrátiť koreň z strom ako an Prvok 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 položka prvok. ./kanál/položka je v skutočnosti XPath syntax (XPath je jazyk na adresovanie častí dokumentu XML). Tu chceme nájsť všetko položka vnúčatá z kanál deti z koreň (označený '.'). Môžete si prečítať viac o podporovanej syntaxi XPath tu .
    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 položka prvky, kde každý položka prvok obsahuje jednu novinku. Takže vytvoríme prázdnotu správy 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: Parsovanie XML v Pythone 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'] 
    dieťa.prívesok je slovník všetkých atribútov súvisiacich s prvkom. Tu nás zaujíma url atribút médiá:obsah namespace tag. Now for all other children we simply do:
    news[child.tag] = child.text.encode('utf8') 
    dieťa.značka obsahuje názov podradeného prvku. dieťa.text 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 newssitems . Nakoniec sa tento zoznam vráti. Ukladanie údajov do súboru CSV Teraz jednoducho uložíme zoznam noviniek do súboru CSV, aby sa dal ľahko použiť alebo upraviť v budúcnosti uložiť do CSV() funkciu. Ak sa chcete dozvedieť viac o zapisovaní prvkov slovníka do súboru CSV, prečítajte si tento článok: Práca so súbormi CSV v Pythone
Takže teraz vyzerajú naše naformátované údaje: výsledok Ako môžete vidieť, údaje hierarchického súboru XML boli prevedené do jednoduchého súboru CSV, takže všetky správy sú uložené vo forme tabuľky. To uľahčuje aj rozširovanie databázy. Dáta podobné JSON je možné použiť aj priamo vo svojich aplikáciách! Toto je najlepšia alternatíva na extrakciu údajov z webových stránok, ktoré neposkytujú verejné API, ale poskytujú niektoré kanály RSS. Všetky kódy a súbory použité vo vyššie uvedenom článku nájdete tu . čo ďalej?
  • Môžete sa pozrieť na ďalšie kanály RSS spravodajského webu použitého vo vyššie uvedenom príklade. Môžete sa pokúsiť vytvoriť rozšírenú verziu vyššie uvedeného príkladu analýzou iných informačných kanálov RSS.
  • Ste fanúšikom kriketu? Potom toto RSS feed vás musí zaujímať! Tento súbor XML môžete analyzovať na zoškrabanie informácií o živých kriketových zápasoch a použiť ho na vytvorenie oznamovača na ploche!
Kvíz o HTML a XML Vytvoriť kvíz