Hvordan bruke Xpath i Python?

stemmer
194

Hva er biblioteket? Er det en full gjennomføring? Hvordan er biblioteket som brukes? Hvor er nettstedet sitt?

Publisert på 12/08/2008 klokken 11:28
kilden bruker
På andre språk...                            


12 svar

stemmer
116

libxml2 har en rekke fordeler:

  1. Tilpasning til spec
  2. Aktiv utvikling og samfunnsdeltakelse
  3. Hastighet. Dette er virkelig en python wrapper rundt en C gjennomføring.
  4. Ubiquity. Den libxml2 biblioteket er gjennomgående og således også testet.

Ulempene er:

  1. Tilpasning til spec . Det er strenge. Ting som standard navnerom håndtering er enklere i andre bibliotek.
  2. Bruk av egen kode. Dette kan være smertefullt avhengig av hvordan søknaden er fordelt / distribuert. RPM er tilgjengelig som lette noe av denne smerten.
  3. Manuell ressurshåndtering. Merk i prøven under samtaler til freeDoc () og xpathFreeContext (). Dette er ikke veldig Pytonske.

Hvis du gjør enkle veivalg, stokk med ElementTree (som er inkludert i Python 2.5). Hvis du trenger full spec compliance eller rå fart og kan takle fordelingen av egen kode, gå med libxml2.

Eksempel på libxml2 XPath Bruk


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

Eksempel på ElementTree XPath Bruk


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

Svarte 26/08/2008 kl. 13:06
kilden bruker

stemmer
80

Den LXML pakken støtter XPath. Det ser ut til å fungere ganske bra, selv om jeg har hatt noen problemer med selv :: aksen. Det er også Amara , men jeg har ikke brukt det personlig.

Svarte 12/08/2008 kl. 11:40
kilden bruker

stemmer
44

Høres ut som en LXML annonse i her. ;) ElementTree inngår i std biblioteket. Under 2,6 og under XPath er ganske svak, men i 2,7 mye bedre :

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
Svarte 22/11/2012 kl. 01:05
kilden bruker

stemmer
38

Bruk LXML. LXML bruker full effekt av libxml2 og libxslt, men pakker dem i mer "Pytonske" bindinger enn Python-bindingene som er innfødt til disse bibliotekene. Som sådan, det blir full XPath 1.0 gjennomføring. Native Elementree støtter en begrenset gruppe XPath, selv om det kan være god nok for dine behov.

Svarte 13/11/2009 kl. 23:11
kilden bruker

stemmer
27

Et annet alternativ er py-dom-XPath , det fungerer sømløst med minidom og er ren Python så fungerer på AppEngine.

import xpath
xpath.find('//item', doc)
Svarte 23/01/2010 kl. 09:30
kilden bruker

stemmer
11

Du kan bruke:

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
Svarte 23/08/2010 kl. 13:00
kilden bruker

stemmer
9

Den nyeste versjonen av elementtree støtter XPath ganske bra. Ikke å være en XPath ekspert jeg kan ikke si sikkert om gjennomføringen er full, men det har oppfylt de fleste av mine behov når du arbeider i Python. Jeg har også bruke LXML og PyXML og jeg finner etree fint fordi det er en standard modul.

MERK: Jeg har siden funnet LXML og for meg er det definitivt den beste XML lib ute for Python. Det gjør XPath pent så vel (men igjen kanskje ikke en full gjennomføring).

Svarte 14/08/2008 kl. 09:48
kilden bruker

stemmer
4

Hvis du vil ha nytte av XPath kombinert med evnen til å også bruke CSS på noe punkt du kan bruke 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!'
Svarte 16/12/2017 kl. 22:16
kilden bruker

stemmer
4

Du kan bruke enkle soupparserfralxml

Eksempel:

from lxml.html.soupparser import fromstring

tree = fromstring("<a>Find me!</a>")
print tree.xpath("//a/text()")
Svarte 15/11/2015 kl. 05:31
kilden bruker

stemmer
4

Et annet bibliotek er 4Suite: http://sourceforge.net/projects/foursuite/

Jeg vet ikke hvordan spec-kompatibelt det er. Men det har fungert veldig bra for min bruk. Det ser forlatt.

Svarte 23/08/2010 kl. 12:57
kilden bruker

stemmer
3

PyXML fungerer godt.

Du sa ikke hvilken plattform du bruker, men hvis du er på Ubuntu kan du få det med sudo apt-get install python-xml. Jeg er sikker på at andre Linux distroer ha det så godt.

Hvis du er på en Mac, er XPath allerede installert, men ikke umiddelbart tilgjengelig. Du kan stille inn PY_USE_XMLPLUSi ditt miljø eller gjøre det Python måten før du importerer xml.xpath:

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

I verste fall kan det hende du må bygge det selv. Denne pakken er ikke lenger vedlikeholdt, men fortsatt bygger fint og arbeider med moderne 2.x Pythons. Grunnleggende docs er her .

Svarte 12/08/2008 kl. 19:34
kilden bruker

stemmer
0

Hvis du kommer til å trenge det for html :

import lxml.html as html
root  = html.fromstring(string)
root.xpath('//meta')
Svarte 29/05/2019 kl. 16:48
kilden bruker

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