Parse xml mit lxml – Extrakt Element Wert

Nehmen wir an, wir haben die XML-Datei mit der Struktur wie folgt.

<?xml version="1.0" ?> <searchRetrieveResponse xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.loc.gov/zing/srw/ http://www.loc.gov/standards/sru/sru1-1archive/xml-files/srw-types.xsd" xmlns="http://www.loc.gov/zing/srw/"> <records xmlns:ns1="http://www.loc.gov/zing/srw/"> <record> <recordData> <record xmlns=""> <datafield tag="000"> <subfield code="a">123</subfield> <subfield code="b">456</subfield> </datafield> <datafield tag="001"> <subfield code="a">789</subfield> <subfield code="b">987</subfield> </datafield> </record> </recordData> </record> <record> <recordData> <record xmlns=""> <datafield tag="000"> <subfield code="a">123</subfield> <subfield code="b">456</subfield> </datafield> <datafield tag="001"> <subfield code="a">789</subfield> <subfield code="b">987</subfield> </datafield> </record> </recordData> </record> </records> </searchRetrieveResponse> 

Ich muss heraus analysieren:

  • Der Inhalt des "Teilfeldes" (zB 123 im obigen Beispiel) und
  • Attributwerte (zB 000 oder 001)

Ich frage mich, wie man das mit lxml und XPath macht. Eingelegt ist mein erster Code und ich bitte jemanden, mich zu erklären, wie man Werte analysiert.

 import urllib, urllib2 from lxml import etree url = "https://dl.dropbox.com/u/540963/short_test.xml" fp = urllib2.urlopen(url) doc = etree.parse(fp) fp.close() ns = {'xsi':'http://www.loc.gov/zing/srw/'} for record in doc.xpath('//xsi:record', namespaces=ns): print record.xpath("xsi:recordData/record/datafield[@tag='000']", namespaces=ns) 

  • Iterate durch alle Zeilen in einer Tabelle mit python lxml xpath
  • Warum getparent () funktioniert nicht wie erwartet?
  • Wie installiere ich lxml auf OS X Leopard ohne MacPorts oder Fink?
  • Python3, lxml und "Symbol nicht gefunden: _lzma_auto_decoder" unter Mac OS X 10.9
  • Xml in python und lxml erzeugen
  • Fehler mit Parse-Funktion in lxml
  • 3 Solutions collect form web for “Parse xml mit lxml – Extrakt Element Wert”

    Ich wäre direkter in deinem XPath: geh gerade für die Elemente, die du willst, in diesem Fall datafield .

     >>> for df in doc.xpath('//datafield'): # Iterate over attributes of datafield for attrib_name in df.attrib: print '@' + attrib_name + '=' + df.attrib[attrib_name] # subfield is a child of datafield, and iterate subfields = df.getchildren() for subfield in subfields: print 'subfield=' + subfield.text 

    Auch lxml scheint, dass du den Namespace ignorierst, vielleicht weil dein Beispiel nur einen Namespace benutzt?

    Versuchen Sie den folgenden Arbeitscode:

     import urllib2 from lxml import etree url = "https://dl.dropbox.com/u/540963/short_test.xml" fp = urllib2.urlopen(url) doc = etree.parse(fp) fp.close() for record in doc.xpath('//datafield'): print record.xpath("./@tag")[0] for x in record.xpath("./subfield/text()"): print "\t", x 

    Ich würde einfach mit gehen

     for df in doc.xpath('//datafield'): print df.attrib for sf in df.getchildren(): print sf.text 

    Auch du brauchst nicht urllib, du kannst direkt mit HTTP analysieren

     url = "http://dl.dropbox.com/u/540963/short_test.xml" #doesn't work with https though doc = etree.parse(url) 
    Python ist die beste Programmiersprache der Welt.