python - parser - xml etree example




Como usar o Xpath em Python? (8)

O que é a biblioteca? Existe uma implementação completa? Como a biblioteca é usada? Onde está o site?


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 ela satisfez a maioria das minhas necessidades ao trabalhar em Python. Eu também uso lxml e PyXML e acho o etree legal porque é um módulo padrão.

NOTA: Eu já encontrei o lxml e, para mim, é definitivamente o melhor lib XML disponível para Python. Ele faz XPath bem (embora, novamente, talvez não seja uma implementação completa).


O pacote lxml suporta o xpath. Parece funcionar muito bem, embora eu tenha tido algum problema com o self :: axis. Há também Amara , mas não o usei pessoalmente.


Outra opção é o py-dom-xpath , ele funciona perfeitamente com o minidom e é puro Python, então funciona no appengine.

import xpath
xpath.find('//item', doc)

Se você quer ter o poder do XPATH combinado com a capacidade de usar CSS a qualquer momento, você pode usar o 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!'

Use o LXML. O LXML usa todo o poder de libxml2 e libxslt, mas os envolve em mais ligações "Pythonic" do que as ligações de 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 de XPath, embora possa ser bom o suficiente para as suas necessidades.


Você pode usar o simples soupparser de lxml

Exemplo:

from lxml.html.soupparser import fromstring

tree = fromstring("<a>Find me!</a>")
print tree.xpath("//a/text()")

PyXML funciona bem.

Você não disse qual plataforma você está usando, no entanto, se você estiver no Ubuntu, você pode obtê-lo com o sudo apt-get install python-xml . Tenho certeza de que outras distribuições Linux também têm.

Se você estiver em um Mac, o xpath já está instalado, mas não está imediatamente acessível. Você pode definir PY_USE_XMLPLUS em seu ambiente ou fazer o caminho do Python antes de importar xml.xpath:

if sys.platform.startswith('darwin'):
    os.environ['PY_USE_XMLPLUS'] = '1'

No pior dos casos, você pode ter que construí-lo sozinho. Este pacote não é mais mantido, mas ainda funciona bem e trabalha com os modernos Python 2.x. Documentos básicos estão here .


libxml2 tem várias vantagens:

  1. Conformidade com a spec
  2. Desenvolvimento ativo e participação da comunidade
  3. Rapidez. Este é realmente um wrapper python em torno de uma implementação C.
  4. Ubiquity. A biblioteca libxml2 é abrangente e, portanto, bem testada.

Desvantagens incluem:

  1. Conformidade com as spec É estrito. Coisas como o tratamento de namespace padrão são mais fáceis em outras bibliotecas.
  2. Uso de código nativo. Isso pode ser uma dor dependendo de como seu aplicativo é distribuído / implantado. RPMs estão disponíveis para aliviar parte dessa dor.
  3. Manipulação manual de recursos. Observe no exemplo abaixo as chamadas para freeDoc () e xpathFreeContext (). Isso não é muito pitonico.

Se você está fazendo uma seleção simples de caminho, fique com o ElementTree (que está incluso no Python 2.5). Se você precisa de compatibilidade completa com especificação ou velocidade bruta e pode lidar com a distribuição de código nativo, vá com libxml2.

Amostra de 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()

Exemplo 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




nodes