Como o @WarrenP diz, a maioria das respostas aqui são extremamente antigas e obsoletas, o Python-2.x, realmente desatualizado. Talvez esta questão deve ser marcado python-2.x
Desenvolvimento ativo e participação da comunidade
Rapidez. Este é realmente um wrapper python em torno de uma implementação em C.
Onipresença. A biblioteca libxml2 é abrangente e, portanto, bem testada.
As desvantagens incluem:
Conformidade com as especificações . É estrito. Coisas como o tratamento de namespace padrão são mais fáceis em outras bibliotecas.
Uso de código nativo. Isso pode ser complicado, dependendo de como o aplicativo é distribuído / implantado. Estão disponíveis RPMs que aliviam um pouco dessa dor.
Manipulação manual de recursos. Observe na amostra abaixo as chamadas para freeDoc () e xpathFreeContext (). Isso não é muito pitonico.
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.ElementTreeimportElementTree
mydoc =ElementTree(file='tst.xml')for e in mydoc.findall('/foo/bar'):print e.get('title').text
usando python 2.7.10 no OSX eu tinha que importar ElementTree comofrom xml.etree.ElementTree import ElementTree
Ben Page
porque é um C invólucro que você pode encontrar dificuldade de implantá-lo a AWS Lambda, a menos que você compilar em uma instância EC2 ou uma imagem Docker da AWS Linux
CpILL
85
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.
A amara é muito legal e nem sempre é necessário o xpath.
gatoatigrado 5/12/2009
Adicione alguns detalhes básicos sobre como usar o XPath com lxml.
jpmc26
56
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.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
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.
Mais fácil que lxml e libxml2 se você já estiver trabalhando com o minidom. Funciona lindamente e é mais "pitonico". O contextna findfunção permitem que você use um outro resultado XPath como um novo contexto de busca.
Ben
3
Eu também tenho usado py-dom-xpath enquanto escrevo um plugin, porque é python puro. Mas acho que não é mais mantido e lembre-se desse bug ("Não é possível acessar um elemento cujo nome é 'texto'"): 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
quando tento o código PyXML, recebi ImportError: No module named extdefrom xml.dom.ext.reader import Sax2
Aminah Nuraini 30/11
9
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).
Atualmente, o suporte XPath do ElementTree é mínimo, na melhor das hipóteses. Existem enormes falhas na funcionalidade, como a falta de seletores de atributos, nenhum eixo não padrão, nenhuma indexação filho etc. A versão 1.3 (em alfa) adiciona alguns desses recursos, mas ainda é uma implementação sem vergonha parcial.
21411 James Brady
8
Você pode usar o simples soupparserdelxml
Exemplo:
from lxml.html.soupparser import fromstring
tree = fromstring("<a>Find me!</a>")print tree.xpath("//a/text()")
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_XMLPLUSem 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 .
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
Amostra de uso do ElementTree XPath
fonte
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.
fonte
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 :
fonte
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.
fonte
Outra opção é o py-dom-xpath , que funciona perfeitamente com o minidom e é puro Python, portanto, funciona no aplicativo.
fonte
context
nafind
função permitem que você use um outro resultado XPath como um novo contexto de busca.Você pode usar:
PyXML :
libxml2 :
fonte
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).
fonte
Você pode usar o simples
soupparser
delxml
Exemplo:
fonte
Se você deseja ter o poder do XPATH combinado com a capacidade de também usar CSS a qualquer momento, você pode usar
parsel
:fonte
//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.
fonte
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: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 .
fonte
Se você vai precisar dele para html :
fonte