Quelles sont les bibliothèques qui prennent en charge Xpath? Y a-t-il une mise en œuvre complète? Comment la bibliothèque est-elle utilisée? Où est son site Internet?
Quelles sont les bibliothèques qui prennent en charge Xpath? Y a-t-il une mise en œuvre complète? Comment la bibliothèque est-elle utilisée? Où est son site Internet?
Réponses:
libxml2 présente un certain nombre d'avantages:
Les inconvénients comprennent:
Si vous faites une sélection de chemin simple, restez avec ElementTree (qui est inclus dans Python 2.5). Si vous avez besoin d'une conformité complète aux spécifications ou d'une vitesse brute et que vous pouvez gérer la distribution de code natif, optez pour libxml2.
Exemple d'utilisation de 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()
Exemple d'utilisation d'ElementTree XPath
from elementtree.ElementTree import ElementTree
mydoc = ElementTree(file='tst.xml')
for e in mydoc.findall('/foo/bar'):
print e.get('title').text
from xml.etree.ElementTree import ElementTree
Le package lxml prend en charge xpath. Cela semble assez bien fonctionner, même si j'ai eu quelques problèmes avec l'axe self ::. Il y a aussi Amara , mais je ne l'ai pas utilisé personnellement.
Cela ressemble à une publicité lxml ici. ;) ElementTree est inclus dans la bibliothèque std. Sous 2.6 et en dessous, son xpath est assez faible, mais dans 2.7+, il s'est beaucoup amélioré :
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
Utilisez LXML. LXML utilise toute la puissance de libxml2 et libxslt, mais les encapsule dans plus de liaisons "Pythonic" que les liaisons Python natives de ces bibliothèques. En tant que tel, il obtient l'implémentation complète de XPath 1.0. Native ElemenTree prend en charge un sous-ensemble limité de XPath, bien qu'il puisse être suffisant pour vos besoins.
Une autre option est py-dom-xpath , il fonctionne de manière transparente avec minidom et est pur Python, donc fonctionne sur appengine.
import xpath
xpath.find('//item', doc)
context
la find
fonction, vous pouvez utiliser un autre résultat xpath comme nouveau contexte de recherche.
Vous pouvez utiliser:
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
ImportError: No module named ext
defrom xml.dom.ext.reader import Sax2
La dernière version de elementtree prend assez bien en charge XPath. N'étant pas un expert XPath, je ne peux pas dire avec certitude si la mise en œuvre est complète, mais elle a satisfait la plupart de mes besoins lorsque je travaillais en Python. J'ai également utilisé lxml et PyXML et je trouve etree sympa car c'est un module standard.
REMARQUE: j'ai depuis trouvé lxml et pour moi, c'est certainement la meilleure bibliothèque XML pour Python. Il fait aussi bien XPath (mais encore une fois peut-être pas une implémentation complète).
Vous pouvez utiliser le simple soupparser
delxml
from lxml.html.soupparser import fromstring
tree = fromstring("<a>Find me!</a>")
print tree.xpath("//a/text()")
Si vous souhaitez combiner la puissance de XPATH avec la possibilité d'utiliser également CSS à tout moment, vous pouvez utiliser 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!'
//li/a/text()
Une autre bibliothèque est 4Suite: http://sourceforge.net/projects/foursuite/
Je ne sais pas à quel point c'est conforme aux spécifications. Mais cela a très bien fonctionné pour mon usage. Il a l'air abandonné.
PyXML fonctionne bien.
Vous n'avez pas dit avec quelle plateforme vous utilisez, mais si vous êtes sur Ubuntu, vous pouvez l'obtenir sudo apt-get install python-xml
. Je suis sûr que d'autres distributions Linux l'ont également.
Si vous êtes sur un Mac, xpath est déjà installé mais pas immédiatement accessible. Vous pouvez définir PY_USE_XMLPLUS
dans votre environnement ou le faire de la manière Python avant d'importer xml.xpath:
if sys.platform.startswith('darwin'):
os.environ['PY_USE_XMLPLUS'] = '1'
Dans le pire des cas, vous devrez peut-être le construire vous-même. Ce paquet n'est plus maintenu mais continue de fonctionner correctement et fonctionne avec les Pythons 2.x modernes. Les documents de base sont ici .