Quais são as bibliotecas que suportam o Xpath? Existe uma implementação completa? Como a biblioteca é usada? Onde está o site dele?
Quais são as bibliotecas que suportam o Xpath? Existe uma implementação completa? Como a biblioteca é usada? Onde está o site dele?
Respostas:
A libxml2 tem várias vantagens:
As desvantagens incluem:
Se você estiver fazendo uma seleção simples de caminho, fique com o ElementTree (incluído no Python 2.5). Se você precisa de conformidade total com as especificações ou velocidade bruta e pode lidar com a distribuição do código nativo, acesse libxml2.
Amostra de uso XPath libxml2
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()
Amostra de uso do 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
O pacote lxml suporta xpath. Parece funcionar muito bem, embora eu tenha tido alguns problemas com o self :: axis. Há também Amara , mas não o usei pessoalmente.
Parece um anúncio lxml aqui. ;) ElementTree está incluído na biblioteca std. Abaixo de 2.6 e abaixo, seu xpath é bastante fraco, mas em 2.7+ muito melhorado :
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
Use LXML. O LXML usa todo o poder do libxml2 e libxslt, mas os agrupa em mais ligações "Pythonic" do que nas ligações do Python que são nativas para essas bibliotecas. Como tal, obtém a implementação completa do XPath 1.0. O ElemenTree nativo suporta um subconjunto limitado do XPath, embora possa ser bom o suficiente para suas necessidades.
Outra opção é o py-dom-xpath , que funciona perfeitamente com o minidom e é puro Python, portanto, funciona no aplicativo.
import xpath
xpath.find('//item', doc)
context
na find
função permitem que você use um outro resultado XPath como um novo contexto de busca.
Você pode 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
defrom xml.dom.ext.reader import Sax2
A versão mais recente do elementtree suporta muito bem o XPath. Não sendo um especialista em XPath, não posso dizer com certeza se a implementação está completa, mas atendeu a maioria das minhas necessidades ao trabalhar em Python. Eu também uso lxml e PyXML e acho o etree agradável porque é um módulo padrão.
NOTA: Desde então, encontrei o lxml e, para mim, é definitivamente a melhor lib XML disponível no Python. Ele também funciona bem com o XPath (embora novamente talvez não seja uma implementação completa).
Você pode usar o simples soupparser
delxml
from lxml.html.soupparser import fromstring
tree = fromstring("<a>Find me!</a>")
print tree.xpath("//a/text()")
Se você deseja ter o poder do XPATH combinado com a capacidade de também usar CSS a qualquer momento, você pode 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()
Outra biblioteca é o 4Suite: http://sourceforge.net/projects/foursuite/
Não sei como é compatível com as especificações. Mas funcionou muito bem para o meu uso. Parece abandonado.
PyXML funciona bem.
Você não disse em qual plataforma está usando, no entanto, se estiver no Ubuntu, pode obtê-lo sudo apt-get install python-xml
. Tenho certeza de que outras distribuições Linux também o têm.
Se você estiver em um Mac, o xpath já está instalado, mas não é acessível imediatamente. Você pode definir PY_USE_XMLPLUS
em seu ambiente ou fazê-lo da maneira Python antes de importar o xml.xpath:
if sys.platform.startswith('darwin'):
os.environ['PY_USE_XMLPLUS'] = '1'
Na pior das hipóteses, você pode ter que construir você mesmo. Este pacote não é mais mantido, mas ainda é compilado e funciona com os modernos Python 2.x. Os documentos básicos estão aqui .