Aktive Entwicklung und Beteiligung der Gemeinschaft
Geschwindigkeit. Dies ist wirklich ein Python-Wrapper um eine C-Implementierung.
Allgegenwart. Die libxml2-Bibliothek ist allgegenwärtig und daher gut getestet.
Nachteile sind:
Einhaltung der Spezifikation . Es ist streng. Dinge wie die Standardbehandlung von Namespaces sind in anderen Bibliotheken einfacher.
Verwendung von nativem Code. Dies kann ein Problem sein, abhängig davon, wie Ihre Anwendung verteilt / bereitgestellt wird. Es sind Drehzahlen verfügbar, die einige dieser Schmerzen lindern.
Manuelle Ressourcenhandhabung. Beachten Sie im folgenden Beispiel die Aufrufe von freeDoc () und xpathFreeContext (). Das ist nicht sehr pythonisch.
Wenn Sie eine einfache Pfadauswahl vornehmen , bleiben Sie bei ElementTree (das in Python 2.5 enthalten ist). Wenn Sie die vollständige Einhaltung der Spezifikationen oder die Geschwindigkeit benötigen und mit der Verteilung von nativem Code fertig werden können, wählen Sie libxml2.
Beispiel für die Verwendung von libxml2 XPath
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 für die Verwendung von ElementTree XPath
from elementtree.ElementTreeimportElementTree
mydoc =ElementTree(file='tst.xml')for e in mydoc.findall('/foo/bar'):print e.get('title').text
mit python 2.7.10 auf osx musste ich elementTree alsfrom xml.etree.ElementTree import ElementTree
Ben Page
Da es sich um einen C-Wrapper handelt, kann es schwierig sein, ihn auf AWS Lambda
bereitzustellen
85
Das lxml-Paket unterstützt xpath. Es scheint ziemlich gut zu funktionieren, obwohl ich einige Probleme mit der self :: Achse hatte. Es gibt auch Amara , aber ich habe es nicht persönlich benutzt.
amara ist ziemlich nett und man braucht nicht immer xpath.
Gatoatigrado
Bitte fügen Sie einige grundlegende Details zur Verwendung von XPath mit lxml hinzu.
jpmc26
56
Klingt wie eine lxml-Werbung hier. ;) ElementTree ist in der Standardbibliothek enthalten. Unter 2.6 und darunter ist sein xpath ziemlich schwach, aber in 2.7+ deutlich verbessert :
import xml.etree.ElementTreeas 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, umschließt sie jedoch mit mehr "Pythonic" -Bindungen als die Python-Bindungen, die in diesen Bibliotheken enthalten sind. Als solches erhält es die vollständige XPath 1.0-Implementierung. Native ElemenTree unterstützt eine begrenzte Teilmenge von XPath, obwohl es für Ihre Anforderungen möglicherweise gut genug ist.
Einfacher als lxml und libxml2, wenn Sie bereits mit minidom arbeiten. Funktioniert wunderbar und ist mehr "Pythonic". Mit contextder findFunktion können Sie ein anderes xpath-Ergebnis als neuen Suchkontext verwenden.
Ben
3
Ich habe auch py-dom-xpath verwendet, als ich ein Plugin schrieb, weil es reines Python ist. Aber ich glaube nicht, dass es mehr gepflegt wird, und bin mir dieses Fehlers bewusst ("Kann nicht auf ein Element zugreifen, dessen Name 'text' ist"): code.google.com/p/py-dom-xpath/issues/detail?id = 8
from xml.dom.ext.reader importSax2from 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
Als ich den PyXML-Code ausprobierte, kam ich ImportError: No module named extvonfrom xml.dom.ext.reader import Sax2
Aminah Nuraini,
9
Die neueste Version von elementtree unterstützt XPath ziemlich gut. Da ich kein XPath-Experte bin, kann ich nicht sicher sagen, ob die Implementierung voll ist, aber sie hat die meisten meiner Anforderungen bei der Arbeit in Python erfüllt. Ich habe auch lxml und PyXML verwendet und finde etree nett, weil es ein Standardmodul ist.
HINWEIS: Ich habe seitdem lxml gefunden und für mich ist es definitiv die beste XML-Bibliothek für Python. Es macht XPath auch gut (obwohl wieder vielleicht keine vollständige Implementierung).
Die XPath-Unterstützung von ElementTree ist derzeit bestenfalls minimal. Es gibt große Lücken in der Funktionalität, wie das Fehlen von Attributselektoren, keine nicht standardmäßigen Achsen, keine untergeordnete Indizierung usw. Version 1.3 (in Alpha) fügt einige dieser Funktionen hinzu, ist jedoch immer noch eine unverschämt teilweise Implementierung.
James Brady
8
Sie können das einfache soupparservon verwendenlxml
Beispiel:
from lxml.html.soupparser import fromstring
tree = fromstring("<a>Find me!</a>")print tree.xpath("//a/text()")
Welchen Unterschied macht die Verwendung von Soupparser?
Padraic Cunningham
Es ist nur eine Alternative
Aminah Nuraini
7
Wenn Sie die Leistungsfähigkeit von XPATH mit der Möglichkeit kombinieren möchten, an jedem Punkt auch CSS zu verwenden, können Sie Folgendes verwenden parsel:
Sie haben nicht gesagt, welche Plattform Sie verwenden, aber wenn Sie unter Ubuntu sind, können Sie es bekommen sudo apt-get install python-xml. Ich bin sicher, andere Linux-Distributionen haben es auch.
Wenn Sie einen Mac verwenden, ist xpath bereits installiert, aber nicht sofort verfügbar. Sie können PY_USE_XMLPLUSin Ihrer Umgebung festlegen oder Python ausführen, bevor Sie xml.xpath importieren:
if sys.platform.startswith('darwin'):
os.environ['PY_USE_XMLPLUS']='1'
Im schlimmsten Fall müssen Sie es möglicherweise selbst bauen. Dieses Paket wird nicht mehr gepflegt, funktioniert aber immer noch gut und funktioniert mit modernen 2.x Pythons. Grundlegende Dokumente finden Sie hier .
Antworten:
libxml2 hat eine Reihe von Vorteilen:
Nachteile sind:
Wenn Sie eine einfache Pfadauswahl vornehmen , bleiben Sie bei ElementTree (das in Python 2.5 enthalten ist). Wenn Sie die vollständige Einhaltung der Spezifikationen oder die Geschwindigkeit benötigen und mit der Verteilung von nativem Code fertig werden können, wählen Sie libxml2.
Beispiel für die Verwendung von libxml2 XPath
Beispiel für die Verwendung von ElementTree XPath
quelle
from xml.etree.ElementTree import ElementTree
Das lxml-Paket unterstützt xpath. Es scheint ziemlich gut zu funktionieren, obwohl ich einige Probleme mit der self :: Achse hatte. Es gibt auch Amara , aber ich habe es nicht persönlich benutzt.
quelle
Klingt wie eine lxml-Werbung hier. ;) ElementTree ist in der Standardbibliothek enthalten. Unter 2.6 und darunter ist sein xpath ziemlich schwach, aber in 2.7+ deutlich verbessert :
quelle
Verwenden Sie LXML. LXML nutzt die volle Leistung von libxml2 und libxslt, umschließt sie jedoch mit mehr "Pythonic" -Bindungen als die Python-Bindungen, die in diesen Bibliotheken enthalten sind. Als solches erhält es die vollständige XPath 1.0-Implementierung. Native ElemenTree unterstützt eine begrenzte Teilmenge von XPath, obwohl es für Ihre Anforderungen möglicherweise gut genug ist.
quelle
Eine andere Option ist py-dom-xpath , es funktioniert nahtlos mit Minidom und ist reines Python, funktioniert also mit Appengine.
quelle
context
derfind
Funktion können Sie ein anderes xpath-Ergebnis als neuen Suchkontext verwenden.Sie können verwenden:
PyXML :
libxml2 :
quelle
ImportError: No module named ext
vonfrom xml.dom.ext.reader import Sax2
Die neueste Version von elementtree unterstützt XPath ziemlich gut. Da ich kein XPath-Experte bin, kann ich nicht sicher sagen, ob die Implementierung voll ist, aber sie hat die meisten meiner Anforderungen bei der Arbeit in Python erfüllt. Ich habe auch lxml und PyXML verwendet und finde etree nett, weil es ein Standardmodul ist.
HINWEIS: Ich habe seitdem lxml gefunden und für mich ist es definitiv die beste XML-Bibliothek für Python. Es macht XPath auch gut (obwohl wieder vielleicht keine vollständige Implementierung).
quelle
Sie können das einfache
soupparser
von verwendenlxml
Beispiel:
quelle
Wenn Sie die Leistungsfähigkeit von XPATH mit der Möglichkeit kombinieren möchten, an jedem Punkt auch CSS zu verwenden, können Sie Folgendes verwenden
parsel
:quelle
//li/a/text()
Eine weitere Bibliothek ist 4Suite: http://sourceforge.net/projects/foursuite/
Ich weiß nicht, wie konform es ist. Aber es hat sehr gut für meinen Gebrauch funktioniert. Es sieht verlassen aus.
quelle
PyXML funktioniert gut.
Sie haben nicht gesagt, welche Plattform Sie verwenden, aber wenn Sie unter Ubuntu sind, können Sie es bekommen
sudo apt-get install python-xml
. Ich bin sicher, andere Linux-Distributionen haben es auch.Wenn Sie einen Mac verwenden, ist xpath bereits installiert, aber nicht sofort verfügbar. Sie können
PY_USE_XMLPLUS
in Ihrer Umgebung festlegen oder Python ausführen, bevor Sie xml.xpath importieren:Im schlimmsten Fall müssen Sie es möglicherweise selbst bauen. Dieses Paket wird nicht mehr gepflegt, funktioniert aber immer noch gut und funktioniert mit modernen 2.x Pythons. Grundlegende Dokumente finden Sie hier .
quelle
Wenn Sie es für HTML benötigen :
quelle