Quali sono le librerie che supportano Xpath? C'è una piena attuazione? Come viene utilizzata la libreria? Dov'è il suo sito Web?
Quali sono le librerie che supportano Xpath? C'è una piena attuazione? Come viene utilizzata la libreria? Dov'è il suo sito Web?
Risposte:
libxml2 ha una serie di vantaggi:
Gli aspetti negativi includono:
Se stai facendo una semplice selezione del percorso, mantieni l'elemento ElementTree (che è incluso in Python 2.5). Se hai bisogno della piena conformità alle specifiche o della velocità pura e riesci a far fronte alla distribuzione del codice nativo, vai con libxml2.
Esempio di libxml2 XPath Use
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()
Esempio di utilizzo di 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
Il pacchetto lxml supporta xpath. Sembra funzionare abbastanza bene, anche se ho avuto qualche problema con il self :: axis. C'è anche Amara , ma non l'ho usato personalmente.
Sembra una pubblicità lxml qui. ;) ElementTree è incluso nella libreria std. Sotto 2.6 e sotto il suo xpath è piuttosto debole, ma in 2.7+ è molto migliorato :
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
Usa LXML. LXML utilizza tutta la potenza di libxml2 e libxslt, ma li avvolge in più collegamenti "Pythonic" rispetto ai collegamenti Python che sono nativi di quelle librerie. Come tale, ottiene l'implementazione completa di XPath 1.0. ElemenTree nativo supporta un sottoinsieme limitato di XPath, sebbene possa essere abbastanza buono per le tue esigenze.
Un'altra opzione è py-dom-xpath , funziona perfettamente con minidom ed è puro Python, quindi funziona su appengine.
import xpath
xpath.find('//item', doc)
context
nella find
funzione consente di utilizzare un altro risultato xpath come nuovo contesto di ricerca.
Puoi usare:
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
dafrom xml.dom.ext.reader import Sax2
L'ultima versione di elementtree supporta abbastanza bene XPath. Non essendo un esperto XPath non posso dire con certezza se l'implementazione è completa ma ha soddisfatto la maggior parte delle mie esigenze quando lavoro in Python. Ho anche usato lxml e PyXML e trovo etree bello perché è un modulo standard.
NOTA: da allora ho trovato lxml e per me è sicuramente la migliore libreria XML disponibile per Python. Funziona bene anche con XPath (anche se forse non è un'implementazione completa).
Puoi usare il semplice soupparser
dalxml
from lxml.html.soupparser import fromstring
tree = fromstring("<a>Find me!</a>")
print tree.xpath("//a/text()")
Se vuoi avere la potenza di XPATH unita alla possibilità di usare anche CSS in qualsiasi momento puoi usare 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()
Un'altra libreria è 4Suite: http://sourceforge.net/projects/foursuite/
Non so quanto sia conforme alle specifiche. Ma ha funzionato molto bene per il mio uso. Sembra abbandonato.
PyXML funziona bene.
Non hai detto quale piattaforma stai usando, tuttavia se sei su Ubuntu puoi ottenerlo sudo apt-get install python-xml
. Sono sicuro che anche altre distribuzioni Linux ce l'hanno.
Se sei su un Mac, xpath è già installato ma non immediatamente accessibile. Puoi impostare PY_USE_XMLPLUS
nel tuo ambiente o farlo in modo Python prima di importare xml.xpath:
if sys.platform.startswith('darwin'):
os.environ['PY_USE_XMLPLUS'] = '1'
Nel peggiore dei casi potresti doverlo costruire da solo. Questo pacchetto non è più gestito ma funziona ancora bene e funziona con i moderni 2.x Pythons. I documenti di base sono qui .