XML analizavimas Python

XML analizavimas Python
Šiame straipsnyje daugiausia dėmesio skiriama tam, kaip galima išanalizuoti nurodytą XML failą ir struktūriškai iš jo išgauti naudingų duomenų. XML: XML reiškia eXtensible Markup Language. Jis buvo skirtas duomenims saugoti ir transportuoti. Jis buvo sukurtas taip, kad būtų skaitomas ir žmogaus, ir mašinų. Štai kodėl XML projektavimo tikslai pabrėžia paprastumo bendrumą ir patogumą naudoti visame internete. XML failas, kurį reikia analizuoti šioje pamokoje, iš tikrųjų yra RSS kanalas. RSS: RSS (Rich Site Summary, dažnai vadinama Really Simple Syndication) naudoja standartinių žiniatinklio sklaidos kanalų formatų šeimą, kad skelbtų dažnai atnaujinamą informaciją, pvz., tinklaraščio įrašus, naujienų antraštes, garso ir vaizdo įrašus. RSS yra XML formatuotas paprastas tekstas.
  • Patį RSS formatą gana lengva perskaityti ir automatizuotiems procesams, ir žmonėms.
  • Šioje mokymo programoje apdorotas RSS yra populiariausių naujienų iš populiarios naujienų svetainės RSS kanalas. Galite tai patikrinti čia . Mūsų tikslas yra apdoroti šį RSS kanalą (arba XML failą) ir išsaugoti jį kitu formatu, kad galėtumėte naudoti ateityje.
Naudojamas Python modulis: Šiame straipsnyje pagrindinis dėmesys bus skiriamas integruoto įrenginio naudojimui xml python modulis, skirtas XML analizei, ir pagrindinis dėmesys bus skiriamas ElementTree XML API šio modulio. Įgyvendinimas: 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:
  • Įkelkite RSS tiekimą iš nurodyto URL ir išsaugokite jį kaip XML failą.
  • Išanalizuokite XML failą, kad išsaugotumėte naujienas kaip žodynų sąrašą, kur kiekvienas žodynas yra vienas naujienų elementas.
  • Išsaugokite naujienas į CSV failą.
Pabandykime suprasti kodą dalimis:
    Įkeliamas ir išsaugomas RSS kanalas
    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 mūsų vietiniame kataloge. Norėdami gauti daugiau informacijos apie tai, kaip veikia užklausų modulis, skaitykite šį straipsnį: GAUTI ir POST užklausas naudodami Python Analizuojamas XML Mes sukūrėme parseXML() funkcija analizuoti XML failą. Žinome, kad XML iš prigimties yra hierarchinis duomenų formatas ir natūraliausias būdas jį pavaizduoti yra medis. Pavyzdžiui, pažiūrėkite į paveikslėlį žemiau: analizuoja XML Čia mes naudojame xml.etree.ElementTree (trumpai vadinkite ET) modulį. Element Tree šiam tikslui turi dvi klases - Elementų medis vaizduoja visą XML dokumentą kaip medį ir Elementas reiškia vieną šio medžio mazgą. Sąveika su visu dokumentu (skaitoma ir rašoma į failus ir iš jų) paprastai atliekama naudojant Elementų medis lygiu. Sąveika su vienu XML elementu ir jo subelementais atliekama Elementas lygiu. Gerai, eikime per parseXML() function now:
    tree = ET.parse(xmlfile) 
    Here we create an Elementų medis objektą analizuodami priimtą xml failą.
    root = tree.getroot() 
    įsišaknijęs () funkcija grąžina šaknį medis kaip an Elementas 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 daiktas elementas. ./channel/item iš tikrųjų yra XPath sintaksė (XPath yra kalba, skirta XML dokumento dalims adresuoti). Čia mes norime rasti viską daiktas anūkai kanalas vaikai iš šaknis (žymimas „.“) elementas. Galite perskaityti daugiau apie palaikomą XPath sintaksę čia .
    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 daiktas elementai, kur kiekvienas daiktas elemente yra viena naujiena. Taigi sukuriame tuščią naujienos 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 analizavimas Python 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'] 
    vaikas.attrib yra visų su elementu susijusių atributų žodynas. Čia mus domina url atributas media:turinys namespace tag. Now for all other children we simply do:
    news[child.tag] = child.text.encode('utf8') 
    vaikas.žyma yra antrinio elemento pavadinimas. vaikas.tekstas 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 naujienų svetainės . Galiausiai šis sąrašas grąžinamas. Duomenų išsaugojimas CSV faile Dabar mes tiesiog išsaugome naujienų sąrašą CSV faile, kad jį būtų galima lengvai naudoti arba modifikuoti ateityje išsaugoti CSV() funkcija. Norėdami sužinoti daugiau apie žodyno elementų rašymą į CSV failą, skaitykite šį straipsnį: Darbas su CSV failais Python
Taigi dabar štai kaip atrodo mūsų suformatuoti duomenys: rezultatas Kaip matote, hierarchinio XML failo duomenys buvo konvertuoti į paprastą CSV failą, kad visos naujienos būtų saugomos lentelės pavidalu. Taip pat lengviau išplėsti duomenų bazę. Taip pat galite naudoti JSON tipo duomenis tiesiogiai savo programose! Tai geriausia alternatyva duomenims išgauti iš svetainių, kurios neteikia viešosios API, bet pateikia kai kuriuos RSS kanalus. Galima rasti visą aukščiau esančiame straipsnyje naudojamą kodą ir failus čia . Kas toliau?
  • Galite pažvelgti į daugiau naujienų svetainės RSS kanalų, naudojamų aukščiau esančiame pavyzdyje. Galite pabandyti sukurti išplėstinę anksčiau pateikto pavyzdžio versiją, analizuodami ir kitus RSS kanalus.
  • Ar esate kriketo gerbėjas? Tada tai RSS kanalas turi sudominti jus! Galite išanalizuoti šį XML failą, kad gautumėte informaciją apie tiesiogines kriketo rungtynes ​​ir sukurtumėte darbalaukio pranešimo priemonę!
HTML ir XML viktorina Sukurti viktoriną