Erhalten Sie die Liste der XML-Attributwerte in Python

Ich muss eine Liste von Attributwerten aus untergeordneten Elementen in Python erhalten.

Es ist am einfachsten, mit einem Beispiel zu erklären.

Angesichts etwas XML wie folgt:

<elements> <parent name="CategoryA"> <child value="a1"/> <child value="a2"/> <child value="a3"/> </parent> <parent name="CategoryB"> <child value="b1"/> <child value="b2"/> <child value="b3"/> </parent> </elements> 

Ich möchte so etwas wie:

 >>> getValues("CategoryA") ['a1', 'a2', 'a3'] >>> getValues("CategoryB") ['b1', 'b2', 'b3'] 

Es sieht aus wie ein Job für XPath, aber ich bin offen für alle Empfehlungen. Ich würde auch gerne über deine Lieblings-Python-XML-Bibliotheken hören.

7 Solutions collect form web for “Erhalten Sie die Liste der XML-Attributwerte in Python”

Ich bin nicht wirklich eine alte Hand bei Python, aber hier ist eine XPath-Lösung mit libxml2.

 import libxml2 DOC = """<elements> <parent name="CategoryA"> <child value="a1"/> <child value="a2"/> <child value="a3"/> </parent> <parent name="CategoryB"> <child value="b1"/> <child value="b2"/> <child value="b3"/> </parent> </elements>""" doc = libxml2.parseDoc(DOC) def getValues(cat): return [attr.content for attr in doc.xpathEval("/elements/parent[@name='%s']/child/@value" % (cat))] print getValues("CategoryA") 

Mit Ergebnis …

 ['a1', 'a2', 'a3'] 

ElementTree 1.3 (leider nicht 1.2 das ist das mit Python enthalten) unterstützt XPath wie folgt:

 import elementtree.ElementTree as xml def getValues(tree, category): parent = tree.find(".//parent[@name='%s']" % category) return [child.get('value') for child in parent] 

Dann können Sie das machen

 >>> tree = xml.parse('data.xml') >>> getValues(tree, 'CategoryA') ['a1', 'a2', 'a3'] >>> getValues(tree, 'CategoryB') ['b1', 'b2', 'b3'] 

lxml.etree (das auch die ElementTree-Schnittstelle zur Verfügung stellt) wird auch auf die gleiche Weise funktionieren.

Mit einem Standard W3 DOM wie dem Stdlib's Minidom oder pxdom:

 def getValues(category): for parent in document.getElementsByTagName('parent'): if parent.getAttribute('name')==category: return [ el.getAttribute('value') for el in parent.getElementsByTagName('child') ] raise ValueError('parent not found') 

Ich muss zugeben, ich bin ein Fan von xmltramp wegen seiner Benutzerfreundlichkeit.

Der Zugriff auf die oben genannten wird:

  import xmltramp values = xmltramp.parse('''...''') def getValues( values, category ): cat = [ parent for parent in values['parent':] if parent(name) == category ] cat_values = [ child(value) for child in parent['child':] for parent in cat ] return cat_values getValues( values, "CategoryA" ) getValues( values, "CategoryB" ) 

Du kannst das mit BeautifulSoup machen

 >>> from BeautifulSoup import BeautifulStoneSoup >>> soup = BeautifulStoneSoup(xml) >>> def getValues(name): . . . return [child['value'] for child in soup.find('parent', attrs={'name': name}).findAll('child')] 

Wenn du mit HTML / XML arbeitest, würde ich dir einen Blick auf BeautifulSoup empfehlen. Es ähnelt dem DOM-Baum, enthält aber mehr Funktionalität.

Meine bevorzugte Python-XML-Bibliothek ist lxml , die libxml2 verpackt.
Xpath scheint der Weg hierher zu gehen, also würde ich das als etwas wie schreiben:

 from lxml import etree def getValues(xml, category): return [x.attrib['value'] for x in xml.findall('/parent[@name="%s"]/*' % category)] xml = etree.parse(open('filename.xml')) >>> print getValues(xml, 'CategoryA') ['a1', 'a2', 'a3'] >>> print getValues(xml, 'CategoryB') ['b1', 'b2', 'b3] 

In Python 3.x ist das Abrufen einer Liste von Attributen eine einfache Aufgabe, die Member items()

Mit dem ElementTree , unten Snippet zeigt eine Möglichkeit, die Liste der Attribute zu erhalten. HINWEIS, dass dieses Beispiel keine Namespaces berücksichtigt, die, falls vorhanden, berücksichtigt werden müssen.

  import xml.etree.ElementTree as ET flName = 'test.xml' tree = ET.parse(flName) root = tree.getroot() for element in root.findall('<child-node-of-root>'): attrList = element.items() print(len(attrList), " : [", attrList, "]" ) 

REFERENZ:

Element.items ()
Gibt die Elementattribute als eine Folge von (name, value) -Paaren zurück.
Die Attribute werden in einer beliebigen Reihenfolge zurückgegeben.

Python-Handbuch

  • Wie kann ich HTML mit html5lib analysieren und das geparste HTML mit XPath abfragen?
  • Python lxml (objektivieren): Xpath Probleme
  • Warum gibt mein Scrapy-Code ein leeres Array zurück?
  • Lxml html xpath Kontext
  • Lxml xpath ignoriert nicht "& nbsp;"
  • Extrahieren von Informationen aus einer Tabelle auf einer Website mit python, LXML & XPATH
  • Das Scraping von Webinhalten mit xpath funktioniert nicht
  • Xpath analysiert die ganze Seite, wenn ich mich nicht an
  • Warum schlägt dieser xpath mit lxml in python aus?
  • Cant Scrape Webseite mit Python Requests Library
  • Wie benutzt man Xpath in Python?
  • Python ist die beste Programmiersprache der Welt.