Cum se utilizează Xpath în Python?

Care este biblioteca? Există o implementare completă? Cum se folosește biblioteca? Unde este site-ul său?

0
fr hi bn
Am această suspiciune mascată că răspunsurile la această întrebare sunt puțin cam învechite.
adăugat autor Warren P, sursa
Răspunsul de la @ gringo-suave arată ca o actualizare bună. stackoverflow.com/a/13504511/1450294
adăugat autor Michael Scheper, sursa

11 răspunsuri

Ultima versiune a elementtree acceptă XPath destul de bine. Nu este un expert XPath Nu pot spune sigur dacă implementarea este plină, dar a satisfăcut majoritatea nevoilor mele atunci când lucrează în Python. Am folosit, de asemenea, lxml și PyXML și găsesc etree frumos pentru că este un modul standard.

NOTĂ: Am găsit de atunci lxml și pentru mine este cu siguranță cel mai bun xml lib acolo pentru Python. XPath este foarte frumos (deși, din nou, poate nu este o implementare completă).

0
adăugat
Suportul XPath de la ElementTree este în prezent minim în cel mai bun caz. Există găuri uriașe în funcționalitate, cum ar fi lipsa selectorilor de atribute, nici o axă non-default, nici o indexare a copilului etc. Versiunea 1.3 (în alfa) adaugă unele dintre aceste caracteristici, dar este încă o implementare parțială neabătută.
adăugat autor James Brady, sursa

PyXML works well.

Nu ai spus ce platformă folosești, totuși dacă ești pe Ubuntu poți să o primești cu sudo apt-get install python-xml . Sunt sigur că și alte distribuții Linux au acest lucru.

Dacă sunteți pe un Mac, xpath este deja instalat, dar nu este imediat accesibil. Puteți să setați PY_USE_XMLPLUS în mediul dvs. sau să o faceți pe Python înainte de a importa xml.xpath:

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

În cel mai rău caz, poate fi necesar să-l construiți singur. Acest pachet nu mai este întreținut, dar se construiește încă bine și funcționează cu Pythons moderne 2.x. Documentele de bază sunt aici .

0
adăugat

pachetul lxml acceptă xpath. Se pare că funcționează destul de bine, deși am avut unele probleme cu axa auto. Există, de asemenea, Amara , dar nu l-am folosit personal.

0
adăugat
Amara e destul de drăguță și nu are întotdeauna nevoie de xpath.
adăugat autor gatoatigrado, sursa
lxml face cu ușurință xml ușor de lucru cu Python.
adăugat autor Jon W, sursa
+1 ca pe PyPI. Simplu ca pip instal lxml
adăugat autor Michal, sursa

Poți să folosești:

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
0
adăugat
când încerc codul PyXML, am primit ImportError: nici un modul numit ext de la din importul xml.dom.ext.reader Sax2
adăugat autor Aminah Nuraini, sursa

Dacă doriți să aveți o combinație de XPATH cu capacitatea de a utiliza și CSS în orice moment, puteți utiliza parsel :

>>> from parsel import Selector
>>> sel = Selector(text=u"""<html>
        <body>
            

Hello, Parsel!

>> >>> sel.css('h1::text').extract_first() 'Hello, Parsel!' >>> sel.xpath('//h1/text()').extract_first() 'Hello, Parsel!'
0
adăugat
pentru a obține textul, ar trebui să fie ceva de genul //li/a/text()
adăugat autor eLRuLL, sursa
cum ar trebui să arate Xpath-ul meu dacă vreau să obțin "Link 1" și "Link 2"?
adăugat autor weefwefwqg3, sursa

Sună ca o reclamă lxml aici. ;) ElementTree este inclus în biblioteca std. Sub 2.6 și sub xpath este destul de slab, dar în 2.7 mult îmbunătățit :

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
0
adăugat

Another library is 4Suite: http://sourceforge.net/projects/foursuite/

Nu știu cum este compatibil cu speculația. Dar a funcționat foarte bine pentru utilizarea mea. Se pare abandonat.

0
adăugat

O altă opțiune este py-dom-xpath , funcționează perfect cu minidom și este pur Python funcționează astfel pe appengine.

import xpath
xpath.find('//item', doc)
0
adăugat
Mai ușor decât lxml și libxml2 dacă deja lucrați cu minidom. Funcționează frumos și este mai "Pythonic". Contextul din funcția find vă permite să utilizați un alt rezultat xpath ca un context de căutare nou.
adăugat autor Ben, sursa
Și eu am folosit py-dom-xpath când scriu un plugin, pentru că este python pur. Dar nu cred că sa menținut și să fiți conștienți de acest bug ("Nu pot accesa un element al cărui nume este" text ""): cod.google.com/p/py-dom-xpath/issues/detail?id=8
adăugat autor Jon Coombs, sursa

libxml2 has a number of advantages:

  1. Compliance to the spec
  2. Active development and a community participation
  3. Speed. This is really a python wrapper around a C implementation.
  4. Ubiquity. The libxml2 library is pervasive and thus well tested.

Dezavantajele includ:

  1. Respectarea spec . Este strict. Lucrurile ca manipularea spațiului de nume implicit sunt mai ușor în alte biblioteci.
  2. Utilizarea codului nativ. Aceasta poate fi o durere în funcție de modul în care aplicația dvs. este distribuită/implementată. Sunt disponibile RPM care ușurează o parte din această durere.
  3. Manipularea manuală a resurselor. Notați în eșantionul de mai jos apelurile la freeDoc() și xpathFreeContext (). Acesta nu este foarte Pythonic.

Dacă faceți o selecție simplă a traseului, lipiți cu ElementTree (care este inclus în Python 2.5) . Dacă aveți nevoie de respectarea spec. Deplină sau viteza brută și puteți face față distribuirii codului nativ, mergeți cu libxml2.

Exemplu de utilizare libxml2 XPath


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

Exemplu 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

0
adăugat
folosind Python 2.7.10 pentru osx a trebuit să importem ElementTree ca din elementul xml.etree.ElementTree de import ElementTree
adăugat autor Ben Page, sursa

Utilizați LXML. LXML folosește puterea completă a libxml2 și libxslt, dar le înfășoară în mai multe legări "Pythonic" decât legăturile Python care sunt originale pentru acele biblioteci. Ca atare, devine implementarea completa a XPath 1.0. Native ElemenTree acceptă un subset limitat de XPath, deși poate fi suficient de bun pentru nevoile dvs.

0
adăugat

You can use the simple soupparser from lxml

Exemplu:

from lxml.html.soupparser import fromstring

tree = fromstring("Find me!")
print tree.xpath("//a/text()")
0
adăugat
Ce diferență are utilizarea lui soupparser?
adăugat autor Padraic Cunningham, sursa
Este doar o alternativă
adăugat autor Aminah Nuraini, sursa
Python România
Python România
100 participanți

Comunitatea pasionaților de Python din România.