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) 

  • Parsing einen Tisch mit rowspan und colspan
  • Cx_freeze mit lxml.html TypeError
  • Lxml entfernen <? Xml ...> Tags beim Parsing?
  • So installieren Sie lxml in Python 3.4 auf Windows-Rechner
  • Schöne Suppe und Tisch Schaben - lxml vs html Parser
  • Verwenden Sie lxml, um Textdatei mit schlechten Header in Python zu analysieren
  • 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.