¿Cuáles son las bibliotecas que admiten Xpath? ¿Hay una implementación completa? ¿Cómo se usa la biblioteca? ¿Dónde está su sitio web?
¿Cuáles son las bibliotecas que admiten Xpath? ¿Hay una implementación completa? ¿Cómo se usa la biblioteca? ¿Dónde está su sitio web?
Respuestas:
libxml2 tiene una serie de ventajas:
Los inconvenientes incluyen:
Si está haciendo una selección de ruta simple, quédese con ElementTree (que se incluye en Python 2.5). Si necesita cumplimiento de especificaciones completas o velocidad sin procesar y puede hacer frente a la distribución del código nativo, vaya con libxml2.
Muestra de uso de 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()
Muestra de uso de 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
El paquete lxml admite xpath. Parece funcionar bastante bien, aunque he tenido algunos problemas con el self :: axis. También está Amara , pero no la he usado personalmente.
Suena como un anuncio lxml aquí. ;) ElementTree está incluido en la biblioteca estándar. Por debajo de 2.6 y por debajo su xpath es bastante débil, pero en 2.7+ mejoró mucho :
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 usa todo el poder de libxml2 y libxslt, pero los envuelve en más enlaces "Pythonic" que los enlaces de Python que son nativos de esas bibliotecas. Como tal, obtiene la implementación completa de XPath 1.0. Native ElemenTree admite un subconjunto limitado de XPath, aunque puede ser lo suficientemente bueno para sus necesidades.
Otra opción es py-dom-xpath , funciona a la perfección con minidom y es Python puro, por lo que funciona en appengine.
import xpath
xpath.find('//item', doc)
context
en la find
función le permite usar otro resultado xpath como un nuevo contexto de búsqueda.
Puedes usar:
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
afrom xml.dom.ext.reader import Sax2
La última versión de elementtree es bastante compatible con XPath. Al no ser un experto en XPath, no puedo decir con certeza si la implementación está completa, pero ha satisfecho la mayoría de mis necesidades cuando trabajo en Python. También utilizo lxml y PyXML y encuentro etree agradable porque es un módulo estándar.
NOTA: Desde entonces encontré lxml y para mí es definitivamente la mejor biblioteca XML que existe para Python. También funciona bien XPath (aunque quizás no sea una implementación completa).
Puedes usar el simple soupparser
delxml
from lxml.html.soupparser import fromstring
tree = fromstring("<a>Find me!</a>")
print tree.xpath("//a/text()")
Si desea tener el poder de XPATH combinado con la capacidad de usar también CSS en cualquier momento, puede usar 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()
Otra biblioteca es 4Suite: http://sourceforge.net/projects/foursuite/
No sé cuán compatible con las especificaciones es. Pero ha funcionado muy bien para mi uso. Se ve abandonado.
PyXML funciona bien.
No dijiste qué plataforma estás utilizando, sin embargo, si estás en Ubuntu, puedes hacerlo sudo apt-get install python-xml
. Estoy seguro de que otras distribuciones de Linux también lo tienen.
Si está en una Mac, xpath ya está instalado pero no es accesible de inmediato. Puede configurarlo PY_USE_XMLPLUS
en su entorno o hacerlo a la manera de Python antes de importar xml.xpath:
if sys.platform.startswith('darwin'):
os.environ['PY_USE_XMLPLUS'] = '1'
En el peor de los casos, puede que tenga que construirlo usted mismo. Este paquete ya no se mantiene, pero aún se construye bien y funciona con las modernas 2.x Pythons. Los documentos básicos están aquí .