XML-Analyse in Python

XML-Analyse in Python
Dieser Artikel konzentriert sich darauf, wie man eine bestimmte XML-Datei analysieren und auf strukturierte Weise einige nützliche Daten daraus extrahieren kann. XML: XML steht für eXtensible Markup Language. Es wurde zum Speichern und Transportieren von Daten entwickelt. Es wurde so konzipiert, dass es sowohl für Menschen als auch für Maschinen lesbar ist. Aus diesem Grund legen die Designziele von XML Wert auf Einfachheit, Allgemeingültigkeit und Benutzerfreundlichkeit im gesamten Internet. Die in diesem Tutorial zu analysierende XML-Datei ist eigentlich ein RSS-Feed. RSS: RSS (Rich Site Summary, oft Really Simple Syndication genannt) verwendet eine Familie von Standard-Web-Feed-Formaten, um häufig aktualisierte Informationen wie Blog-Einträge, Nachrichten, Schlagzeilen, Audio-Videos zu veröffentlichen. RSS ist XML-formatierter Klartext.
  • Das RSS-Format selbst ist sowohl für automatisierte Prozesse als auch für Menschen relativ einfach zu lesen.
  • Der in diesem Tutorial verarbeitete RSS-Feed ist der RSS-Feed der Top-Nachrichten einer beliebten Nachrichten-Website. Sie können es sich ansehen Hier . Unser Ziel ist es, diesen RSS-Feed (oder die XML-Datei) zu verarbeiten und für die zukünftige Verwendung in einem anderen Format zu speichern.
Verwendetes Python-Modul: Dieser Artikel konzentriert sich auf die Verwendung von Inbuilt xml Modul in Python zum Parsen von XML und der Schwerpunkt liegt auf dem ElementTree XML-API dieses Moduls. Durchführung: 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:
  • Laden Sie den RSS-Feed von der angegebenen URL und speichern Sie ihn als XML-Datei.
  • Analysieren Sie die XML-Datei, um Nachrichten als Liste von Wörterbüchern zu speichern, wobei jedes Wörterbuch eine einzelne Nachricht darstellt.
  • Speichern Sie die Nachrichten in einer CSV-Datei.
Versuchen wir, den Code in Teilen zu verstehen:
    RSS-Feed laden und speichern
    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 in unserem lokalen Verzeichnis. Weitere Informationen zur Funktionsweise des Anforderungsmoduls finden Sie in diesem Artikel: GET- und POST-Anfragen mit Python XML analysieren Wir haben geschaffen parseXML() Funktion zum Parsen einer XML-Datei. Wir wissen, dass XML ein inhärent hierarchisches Datenformat ist und die natürlichste Art, es darzustellen, ein Baum ist. Schauen Sie sich zum Beispiel das Bild unten an: XML analysieren Hier verwenden wir xml.etree.ElementTree (kurz ET nennen) Modul. Element Tree verfügt zu diesem Zweck über zwei Klassen: ElementTree stellt das gesamte XML-Dokument als Baum dar und Element stellt einen einzelnen Knoten in diesem Baum dar. Interaktionen mit dem gesamten Dokument (Lesen und Schreiben in/aus Dateien) erfolgen normalerweise auf der ElementTree Ebene. Interaktionen mit einem einzelnen XML-Element und seinen Unterelementen erfolgen auf der Element Ebene. Ok, also lasst uns das durchgehen parseXML() function now:
    tree = ET.parse(xmlfile) 
    Here we create an ElementTree Objekt durch Parsen des übergebenen Objekts xmldatei.
    root = tree.getroot() 
    getrooted() Funktion gibt die Wurzel von zurück Baum als 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 Artikel Element. ./channel/item ist eigentlich XPath Syntax (XPath ist eine Sprache zur Adressierung von Teilen eines XML-Dokuments). Hier wollen wir alle finden Artikel Enkel von Kanal Kinder der Wurzel (gekennzeichnet durch „.“) Element. Weitere Informationen zur unterstützten XPath-Syntax finden Sie hier Hier .
    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 Artikel Elemente, bei denen jedes Artikel Element enthält eine Nachricht. Also erstellen wir ein Leerzeichen Nachricht 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-Analyse in 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'] 
    Kinderattribut ist ein Wörterbuch aller Attribute, die sich auf ein Element beziehen. Hier interessiert uns URL Attribut von Medien:Inhalt namespace tag. Now for all other children we simply do:
    news[child.tag] = child.text.encode('utf8') 
    child.tag enthält den Namen des untergeordneten Elements. kind.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 Nachrichten . Abschließend wird diese Liste zurückgegeben. Daten in einer CSV-Datei speichern Jetzt speichern wir einfach die Liste der Nachrichten in einer CSV-Datei, damit sie in Zukunft problemlos verwendet oder geändert werden kann savetoCSV() Funktion. Weitere Informationen zum Schreiben von Wörterbuchelementen in eine CSV-Datei finden Sie in diesem Artikel: Arbeiten mit CSV-Dateien in Python
So sehen nun unsere formatierten Daten aus: Ergebnis Wie Sie sehen, wurden die hierarchischen XML-Dateidaten in eine einfache CSV-Datei konvertiert, sodass alle Nachrichten in Form einer Tabelle gespeichert werden. Dies erleichtert auch die Erweiterung der Datenbank. Man kann die JSON-ähnlichen Daten auch direkt in seinen Anwendungen verwenden! Dies ist die beste Alternative zum Extrahieren von Daten von Websites, die keine öffentliche API, aber einige RSS-Feeds bereitstellen. Alle im obigen Artikel verwendeten Codes und Dateien finden Sie hier Hier . Was kommt als nächstes?
  • Sie können sich weitere RSS-Feeds der im obigen Beispiel verwendeten Nachrichten-Website ansehen. Sie können versuchen, eine erweiterte Version des obigen Beispiels zu erstellen, indem Sie auch andere RSS-Feeds analysieren.
  • Sind Sie ein Cricket-Fan? Dann Das RSS-Feed muss Ihr Interesse wecken! Sie können diese XML-Datei analysieren, um Informationen über die Live-Cricket-Spiele zu extrahieren und daraus einen Desktop-Benachrichtigungsdienst zu erstellen!
Quiz zu HTML und XML Quiz erstellen

Top Artikel

Kategorie

Interessante Artikel