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 .

  • Xpath, um nur direkte Geschwister mit passenden Attributen auszuwählen
  • Kratzen neuer ESPN-Site mit xpath [Python]
  • Wie kann ich diesen XPath-Ausdruck in BeautifulSoup übersetzen?
  • Iterate durch alle Zeilen in einer Tabelle mit python lxml xpath
  • Extrahieren von lxml xpath für html table
  • Wie verwende ich leere Namespaces in einer lxml xpath-Abfrage?
  • Wie selektiere ich Elemente in einem iframe mit Xpath?
  • Python und libxml2: wie man in xml-Knoten mit XPATH iterieren kann
  • Parse HTML über XPath
  • Brauchen Sie Hilfe bei Verwendung von XPath in ElementTree
  • Wie man eine Variable in LXML XPath Expression verwendet
  • Python ist die beste Programmiersprache der Welt.