XML-parsing i Python

XML-parsing i Python
Denne artikkelen fokuserer på hvordan man kan analysere en gitt XML-fil og trekke ut noen nyttige data ut av den på en strukturert måte. XML: XML står for eXtensible Markup Language. Den ble designet for å lagre og transportere data. Den ble designet for å være lesbar av både mennesker og maskin. Det er derfor designmålene til XML legger vekt på enkelhet og brukervennlighet på tvers av Internett. XML-filen som skal analyseres i denne opplæringen er faktisk en RSS-feed. RSS: RSS (Rich Site Summary ofte kalt Really Simple Syndication) bruker en familie med standard nettfeedformater for å publisere ofte oppdatert informasjon som blogginnlegg nyhetsoverskrifter lydvideo. RSS er XML-formatert ren tekst.
  • RSS-formatet i seg selv er relativt enkelt å lese både av automatiserte prosesser og av mennesker.
  • RSS-en som behandles i denne opplæringen er RSS-feeden med toppnyheter fra et populært nyhetsnettsted. Du kan sjekke det ut her . Målet vårt er å behandle denne RSS-feeden (eller XML-filen) og lagre den i et annet format for fremtidig bruk.
Python-modul brukt: Denne artikkelen vil fokusere på bruk av innebygd xml modul i python for parsing av XML og hovedfokus vil være på ElementTree XML API av denne modulen. Implementering: 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:
  • Last inn RSS-feed fra spesifisert URL og lagre den som en XML-fil.
  • Parse XML-filen for å lagre nyheter som en liste over ordbøker der hver ordbok er en enkelt nyhet.
  • Lagre nyhetene i en CSV-fil.
La oss prøve å forstå koden i stykker:
    Laster og lagrer RSS-feed
    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 i vår lokale katalog. For mer innsikt i hvordan forespørselsmodulen fungerer, følg denne artikkelen: GET og POST-forespørsler ved hjelp av Python Parsing XML Vi har skapt parseXML() funksjon for å analysere XML-fil. Vi vet at XML er et iboende hierarkisk dataformat og den mest naturlige måten å representere det på er med et tre. Se for eksempel på bildet nedenfor: analysere XML Her bruker vi xml.etree.ElementTree (kall det kort ET) modul. Element Tree har to klasser for dette formålet - ElementTree representerer hele XML-dokumentet som et tre og Element representerer en enkelt node i dette treet. Interaksjoner med hele dokumentet (lesing og skriving til/fra filer) gjøres vanligvis på ElementTree nivå. Interaksjoner med et enkelt XML-element og dets underelementer gjøres på Element nivå. Ok, så la oss gå gjennom parseXML() function now:
    tree = ET.parse(xmlfile) 
    Here we create an ElementTree objekt ved å analysere det beståtte xml-fil.
    root = tree.getroot() 
    getrooted() funksjon returner roten til tre som en Element 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 punkt element. ./kanal/vare er faktisk XPath syntaks (XPath er et språk for adressering av deler av et XML-dokument). Her ønsker vi å finne alt punkt barnebarn av kanal barn av rot (angitt med '.') element. Du kan lese mer om støttet XPath-syntaks her .
    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 punkt elementer hvor hver punkt element inneholder én nyhet. Så vi lager en tom nyheter 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-parsing i 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'] 
    barn.attrib er en ordbok over alle attributtene knyttet til et element. Her er vi interessert i url attributt til media: innhold namespace tag. Now for all other children we simply do:
    news[child.tag] = child.text.encode('utf8') 
    child.tag inneholder navnet på underordnet element. barn.tekst 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 nyhetssider . Til slutt er denne listen returnert. Lagre data til en CSV-fil Nå lagrer vi bare listen over nyheter i en CSV-fil, slik at den enkelt kan brukes eller endres i fremtiden ved å bruke lagretoCSV() funksjon. For å vite mer om å skrive ordbokelementer til en CSV-fil, gå gjennom denne artikkelen: Arbeide med CSV-filer i Python
Så her er hvordan våre formaterte data ser ut nå: resultat Som du kan se har de hierarkiske XML-fildataene blitt konvertert til en enkel CSV-fil slik at alle nyhetssaker lagres i form av en tabell. Dette gjør det lettere å utvide databasen også. Man kan også bruke JSON-lignende data direkte i applikasjonene deres! Dette er det beste alternativet for å trekke ut data fra nettsteder som ikke tilbyr et offentlig API, men som gir noen RSS-feeder. All koden og filene som er brukt i artikkelen ovenfor kan bli funnet her . Hva neste?
  • Du kan ta en titt på flere rss-feeder fra nyhetsnettstedet som ble brukt i eksemplet ovenfor. Du kan prøve å lage en utvidet versjon av eksemplet ovenfor ved å analysere andre rss-feeder også.
  • Er du en cricket-fan? Da dette rss-feed må være av interesse! Du kan analysere denne XML-filen for å skrape informasjon om live cricket-kampene og bruke til å lage en skrivebordsvarsler!
Quiz av HTML og XML Lag quiz