Hoe gebruik je XPath in Python?

Wat zijn de bibliotheken die XPath ondersteunen? Is er een volledige implementatie? Hoe wordt de bibliotheek gebruikt? Waar is de website?


Antwoord 1, autoriteit 100%

libxml2heeft een aantal voordelen:

  1. Naleving van de specificatie
  2. Actieve ontwikkeling en participatie van de gemeenschap
  3. Snelheid. Dit is echt een python-wrapper rond een C-implementatie.
  4. Alomtegenwoordigheid. De bibliotheek libxml2 is alomtegenwoordig en dus goed getest.

Nadelen zijn onder meer:

  1. Naleving van de specificatie. Het is streng. Dingen zoals de standaardafhandeling van naamruimten zijn gemakkelijker in andere bibliotheken.
  2. Gebruik van native code. Dit kan lastig zijn, afhankelijk van hoe uw applicatie wordt gedistribueerd / geïmplementeerd. Er zijn RPM’s beschikbaar die een deel van deze pijn verlichten.
  3. Handmatige verwerking van bronnen. Noteer in het onderstaande voorbeeld de aanroepen van freeDoc() en xpathFreeContext(). Dit is niet erg Pythonisch.

Als je een eenvoudige padselectie uitvoert, blijf dan bij ElementTree(dat is opgenomen in Python 2.5 ). Als je volledige specificatie of onbewerkte snelheid nodig hebt en de distributie van native code aankan, ga dan met libxml2.

Voorbeeld van libxml2 XPath-gebruik


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

monster van Elementtree XPath Gebruik


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


Antwoord 2, Autoriteit 66%

De LXML-pakket ondersteunt xpath. Het lijkt redelijk goed te werken, hoewel ik problemen heb met het zelf: Axis. Er staat ook amara , maar ik heb het niet persoonlijk gebruikt.


Antwoord 3, Autoriteit 47%

Klinkt als een LXML-advertentie hier. 😉 Elementtree is opgenomen in de STD-bibliotheek. Onder 2.6 en onder zijn XPath is behoorlijk zwak, maar in 2.7 + veel verbeterd :

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

Antwoord 4, Autoriteit 31%

Gebruik LXML. LXML gebruikt de volledige kracht van LibXML2 en Libxslt, maar wikkelt ze in meer “pythonische” bindingen dan de Python-bindingen die afkomstig zijn uit die bibliotheken. Als zodanig krijgt het de volledige XPATH 1.0-implementatie. Native Elementree ondersteunt een beperkte subset van XPath, hoewel het goed genoeg kan zijn voor uw behoeften.


Antwoord 5, Autoriteit 24%

een andere optie is py-dom-xpath , het werkt naadloos mee Minidom en is pure python, dus werkt op APPENGINE.

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

Antwoord 6, Autoriteit 11%

U kunt gebruiken:

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

Antwoord 7, Autoriteit 8%

U kunt de eenvoudige soupparservan lxml

gebruiken

Voorbeeld:

from lxml.html.soupparser import fromstring
tree = fromstring("<a>Find me!</a>")
print tree.xpath("//a/text()")

Antwoord 8, Autoriteit 7%

De nieuwste versie van Elementtree ondersteunt XPath redelijk goed. Niet een XPath-expert zijn Ik kan niet zeker zeggen of de implementatie vol is, maar het heeft de meeste van mijn behoeften voldaan bij het werken in Python. Ik gebruik ook LXML en Pyxml en ik vind Etree leuk omdat het een standaardmodule is.

Opmerking: ik heb sindsdien LXML en voor mij gevonden, het is absoluut de beste XML Lib die er voor Python is. Het doet Xpath goed en ook (hoewel misschien nog een keer geen volledige implementatie).


Antwoord 9, Autoriteit 6%

Als u de kracht van XPath wilt hebben gecombineerd met de mogelijkheid om ook CSS te gebruiken op een willekeurig moment, kunt u 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!'

Antwoord 10, Autoriteit 2%

Nog een bibliotheek is 4SUITE: http://sourceforge.net/projects/foursuite/

Ik weet niet hoe spec-compliant het is. Maar het heeft heel goed gewerkt voor mijn gebruik. Het ziet er verlaten uit.


Antwoord 11, Autoriteit 2%

pyxml werkt goed.

U hebt niet gezegd welk platform u gebruikt, maar als u op ubuntu bent, kunt u het krijgen met sudo apt-get install python-xml. Ik weet zeker dat andere Linux Distros het ook heeft.

Als u op een Mac staat, is XPath al geïnstalleerd, maar niet meteen toegankelijk. U kunt PY_USE_XMLPLUSin uw omgeving instellen of de Python Way uitvoeren voordat u XML.xPath importeert:

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

In het ergste geval moet je het misschien zelf bouwen. Dit pakket wordt niet meer onderhouden maar bouwt nog prima en werkt met moderne 2.x Pythons. Basisdocumenten zijn hier.


Antwoord 12

Als je het nodig hebt voor html:

import lxml.html as html
root  = html.fromstring(string)
root.xpath('//meta')

Other episodes