Como usar XPath em Python?

votos
190

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

Publicado 12/08/2008 em 12:28
fonte usuário
Em outras línguas...                            


11 respostas

votos
115

libxml2 tem um número de vantagens:

  1. Conformidade com a especificação
  2. desenvolvimento ativo e uma participação da comunidade
  3. Rapidez. Este é realmente um invólucro de python em torno de uma implementação C.
  4. Ubiquity. A biblioteca libxml2 é generalizada e, portanto, bem testado.

Desvantagens incluem:

  1. Conformidade com a especificação . É rigoroso. Coisas como a manipulação namespace padrão são mais fáceis em outras bibliotecas.
  2. Uso de código nativo. Esta pode ser uma dor, dependendo da sua como a sua aplicação é distribuída / implantado. RPMs estão disponíveis que aliviar um pouco essa dor.
  3. manejo de recursos manual. Observe no exemplo abaixo as chamadas para FreeDoc () e xpathFreeContext (). Isso não é muito Pythonic.

Se você estiver fazendo a seleção caminho simples, vara com ElementTree (que está incluído no Python 2.5). Se você precisar de atendimento especificação completa ou a velocidade crua e pode lidar com a distribuição de código nativo, ir 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()

Amostra de ElementTree XPath Use


from elementtree.ElementTree import ElementTree
mydoc = ElementTree(file='tst.xml')
for e in mydoc.findall('/foo/bar'):
    print e.get('title').text

Respondeu 26/08/2008 em 14:06
fonte usuário

votos
80

O pacote lxml suporta XPath. Parece funcionar muito bem, embora eu tive alguns problemas com o self :: eixo. Há também Amara , mas eu nunca usei isso pessoalmente.

Respondeu 12/08/2008 em 12:40
fonte usuário

votos
43

Soa como um anúncio publicitário lxml aqui. ;) ElementTree está incluído na biblioteca std. Sob 2.6 e abaixo do seu XPath é muito fraco, mas em 2,7 melhorou muito :

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
Respondeu 22/11/2012 em 02:05
fonte usuário

votos
38

Use lxml. Lxml usa todo o poder do libxml2 e libxslt, mas envolve-los em mais ligações "Pythonic" do que as ligações Python que são nativas dessas bibliotecas. Como tal, torna-se a plena implementação XPath 1.0. Native ElemenTree suporta um subconjunto limitado de XPath, embora possa ser bom o suficiente para suas necessidades.

Respondeu 14/11/2009 em 00:11
fonte usuário

votos
27

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

import xpath
xpath.find('//item', doc)
Respondeu 23/01/2010 em 10:30
fonte usuário

votos
11

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
Respondeu 23/08/2010 em 14:00
fonte usuário

votos
9

A última versão do ElementTree suporta XPath muito bem. Não sendo um especialista XPath Eu não posso dizer com certeza se a implementação está cheio mas satisfez a maioria das minhas necessidades quando se trabalha em Python. Eu também usar lxml e PyXML e acho etree bom porque é um módulo padrão.

NOTA: Eu já lxml encontrado e para mim é definitivamente a melhor lib XML lá fora para Python. Ele faz XPath bem também (embora, novamente, talvez não uma implementação completa).

Respondeu 14/08/2008 em 10:48
fonte usuário

votos
5

Você pode usar o simples soupparserdelxml

Exemplo:

from lxml.html.soupparser import fromstring

tree = fromstring("<a>Find me!</a>")
print tree.xpath("//a/text()")
Respondeu 15/11/2015 em 05:31
fonte usuário

votos
4

Outra biblioteca é 4Suite: http://sourceforge.net/projects/foursuite/

Eu não sei como especificação-compliant é. Mas ele tem trabalhado muito bem para o meu uso. Ele parece abandonado.

Respondeu 23/08/2010 em 13:57
fonte usuário

votos
3

Se você quer ter o poder de XPATH combinado com a capacidade de também usar CSS em 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!'
Respondeu 16/12/2017 em 22:16
fonte usuário

votos
3

PyXML funciona bem.

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

Se você estiver em um Mac, xpath já está instalado, mas não imediatamente acessível. Você pode definir PY_USE_XMLPLUSem seu ambiente ou fazê-lo a maneira 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 constrói bem e trabalha com Pythons 2.x modernos. Docs básicos são aqui .

Respondeu 12/08/2008 em 20:34
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more