Welche Bibliotheken unterstützen Xpath? Gibt es eine vollständige Implementierung? Wie wird die Bibliothek genutzt? Wo ist die Website?
Welche Bibliotheken unterstützen Xpath? Gibt es eine vollständige Implementierung? Wie wird die Bibliothek genutzt? Wo ist die Website?
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
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.ElementTree import ElementTree
mydoc = ElementTree(file='tst.xml')
for e in mydoc.findall('/foo/bar'):
print e.get('title').text
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.
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.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, 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.
Eine andere Option ist py-dom-xpath , es funktioniert nahtlos mit Minidom und ist reines Python, funktioniert also mit Appengine.
import xpath
xpath.find('//item', doc)
context
der find
Funktion können Sie ein anderes xpath-Ergebnis als neuen Suchkontext verwenden.
Sie können verwenden:
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
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).
Sie können das einfache soupparser
von verwendenlxml
from lxml.html.soupparser import fromstring
tree = fromstring("<a>Find me!</a>")
print tree.xpath("//a/text()")
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
:
>>> from parsel import Selector
>>> sel = Selector(text=u"""<html>
<body>
<h1>Hello, Parsel!</h1>
<ul>
<li><a href="http://example.com">Link 1</a></li>
<li><a href="http://scrapy.org">Link 2</a></li>
</ul
</body>
</html>""")
>>>
>>> sel.css('h1::text').extract_first()
'Hello, Parsel!'
>>> sel.xpath('//h1/text()').extract_first()
'Hello, Parsel!'
//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.
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:
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 .