Wie benutzt man Xpath in Python?

Was ist die Bibliothek? Gibt es eine vollständige Umsetzung? Wie wird die Bibliothek benutzt? Wo ist seine Website?

10 Solutions collect form web for “Wie benutzt man Xpath in Python?”

Libxml2 hat eine Reihe von Vorteilen:

  1. Einhaltung der Spezifikation
  2. Aktive Entwicklung und eine Beteiligung der Gemeinschaft
  3. Geschwindigkeit. Das ist wirklich ein Python-Wrapper um eine C-Implementierung.
  4. Allgegenwart. Die Bibliothek libxml2 ist weit verbreitet und somit gut getestet.

Downsides sind:

  1. Einhaltung der Spezifikation Es ist streng. Dinge wie Standard-Namespace Handling sind in anderen Bibliotheken einfacher.
  2. Verwendung von nativen Code. Dies kann ein Schmerz sein, je nachdem, wie Ihre Anwendung verteilt / eingesetzt wird. RPMs sind verfügbar, die einige dieser Schmerzen erleichtern.
  3. Manuelle Ressourcenbehandlung. Beachten Sie im Beispiel unterhalb der Aufrufe von freeDoc () und xpathFreeContext (). Das ist nicht sehr pythonisch.

Wenn du eine einfache Pfadauswahl machst , bleib mit ElementTree (das in Python 2.5 enthalten ist). Wenn Sie volle Spezifikation oder rohe Geschwindigkeit benötigen und mit der Verteilung des nativen Codes fertig werden können, gehen Sie mit libxml2.

Beispiel von libxml2 XPath Verwendung


import libxml2 doc = libxml2.parseFile("tst.xml") ctxt = doc.xpathNewContext() res = ctxt.xpathEval("//*") if len(res) != 2: print "xpath query: wrong node set size" sys.exit(1) if res[0].name != "doc" or res[1].name != "foo": print "xpath query: wrong node set value" sys.exit(1) doc.freeDoc() ctxt.xpathFreeContext() 

Beispiel von ElementTree XPath Verwendung


 from elementtree.ElementTree import ElementTree mydoc = ElementTree(file='tst.xml') for e in mydoc.findall('/foo/bar'): print e.get('title').text 

Das lxml Paket unterstützt xpath. Es scheint ziemlich gut zu funktionieren, obwohl ich einige Schwierigkeiten mit der Selbst :: Achse hatte. Es gibt auch Amara , aber ich habe es nicht persönlich benutzt.

Klingt wie eine lxml-Anzeige hier. 😉 ElementTree ist in der std-Bibliothek enthalten. Unter 2.6 und unter seinem xpath ist ziemlich schwach, aber in 2,7 viel verbessert :

 import xml.etree.ElementTree as ET root = ET.parse(filename) result = '' for elem in root.findall('.//child/grandchild'): # How to make decisions based on attributes even in 2.6: if elem.attrib.get('name') == 'foo': result = elem.text break 

Verwenden Sie LXML. LXML nutzt die volle Leistung von libxml2 und libxslt, aber wraps sie in mehr "Pythonic" Bindungen als die Python Bindungen, die in diesen Bibliotheken heimisch sind. Als solches bekommt man die vollständige XPath 1.0 Implementierung. Native ElemenTree unterstützt eine begrenzte Teilmenge von XPath, obwohl es gut genug für Ihre Bedürfnisse sein kann.

Eine weitere Option ist py-dom-xpath , es funktioniert nahtlos mit minidom und ist reine Python so funktioniert auf appengine.

 import xpath xpath.find('//item', doc) 

Sie können:

PyXML :

 from xml.dom.ext.reader import Sax2 from xml import xpath doc = Sax2.FromXmlFile('foo.xml').documentElement for url in xpath.Evaluate('//@Url', doc): print url.value 

Libxml2 :

 import libxml2 doc = libxml2.parseFile('foo.xml') for url in doc.xpathEval('//@Url'): print url.content 

Die neueste Version von elementtree unterstützt XPath ziemlich gut. Nicht ein XPath-Experte Ich kann nicht sicher sagen, ob die Umsetzung voll ist, aber es hat die meisten meiner Bedürfnisse bei der Arbeit in Python erfüllt. Ich habe auch lxml und PyXML und ich finde etree nice, weil es ein Standard-Modul ist.

HINWEIS: Ich habe seither lxml gefunden und für mich ist es definitiv die beste XML-lib da draußen für Python. Es macht XPath auch gut (wenn auch nicht mal eine volle Implementierung).

Eine andere Bibliothek ist 4Suite: http://sourceforge.net/projects/foursuite/

Ich weiß nicht, wie spec-konform es ist. Aber es hat sehr gut funktioniert für meinen Gebrauch. Es sieht aufgegeben aus.

Du kannst den einfachen soupparser von lxml benutzen

Beispiel:

 from lxml.html.soupparser import fromstring tree = fromstring("<a>Find me!</a>") print tree.xpath("//a/text()") 

PyXML funktioniert gut.

Sie haben nicht gesagt, welche Plattform Sie verwenden, aber wenn Sie auf Ubuntu sind, können Sie es mit sudo apt-get install python-xml . Ich bin mir sicher, dass andere Linux-Distros es auch haben.

Wenn du auf einem Mac bist, ist xpath bereits installiert, aber nicht sofort zugänglich. Sie können PY_USE_XMLPLUS in Ihrer Umgebung PY_USE_XMLPLUS oder tun Sie es die Python-Methode, bevor Sie xml.xpath importieren:

 if sys.platform.startswith('darwin'): os.environ['PY_USE_XMLPLUS'] = '1' 

Im schlimmsten Fall musst du es selbst bauen. Dieses Paket wird nicht mehr gepflegt, aber es baut noch gut und arbeitet mit modernen 2.x Pythons. Grundlegende Dokumente sind hier .

  • Lxml findall SyntaxError: ungültiges Prädikat
  • Wie bekomme ich XPath 'kein' in Python, wenn keine Daten gefunden wurden?
  • Wertattribut für lxml.html
  • XPath: Tag mit leerem Wert auswählen
  • Holen Sie sich das innere HTML eines Elements in lxml
  • Wie kann ich den richtigen XPath bestimmen?
  • XPATH - html mit vielen Kindern
  • Extrahieren von Just-Sibling-Element in xpath
  • Die Grenze von Element Tree auf xpath
  • Xpath-Lookup über lxml beginnend von root anstatt element
  • Benötige xpath-Locators für sichtbare Elemente
  • Python ist die beste Programmiersprache der Welt.