Jakie biblioteki obsługują Xpath? Czy jest pełna implementacja? Jak używana jest biblioteka? Gdzie jest jego strona internetowa?
Jakie biblioteki obsługują Xpath? Czy jest pełna implementacja? Jak używana jest biblioteka? Gdzie jest jego strona internetowa?
Odpowiedzi:
libxml2 ma wiele zalet:
Minusy obejmują:
Jeśli dokonujesz prostego wyboru ścieżki, trzymaj się elementu ElementTree (który jest zawarty w Pythonie 2.5). Jeśli potrzebujesz pełnej specyfikacji lub surowej prędkości i poradzisz sobie z dystrybucją kodu natywnego, skorzystaj z libxml2.
Przykład użycia XPath libxml2
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()
Przykład użycia XPath ElementTree
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
Do pakietów lxml podpory XPath. Wygląda na to, że działa całkiem dobrze, chociaż miałem pewne problemy z osią self ::. Jest też Amara , ale nie korzystałem z niej osobiście.
Brzmi jak reklama lxml tutaj. ;) ElementTree jest zawarty w bibliotece std. Poniżej 2.6 i poniżej jego xpath jest dość słaby, ale w 2.7+ znacznie poprawiony :
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
Użyj LXML. LXML wykorzystuje pełną moc libxml2 i libxslt, ale pakuje je w więcej „Pythonic” powiązań niż w Python, które są rodzime dla tych bibliotek. W związku z tym uzyskuje pełną implementację XPath 1.0. Natywny ElemenTree obsługuje ograniczony podzbiór XPath, chociaż może być wystarczający dla twoich potrzeb.
Inną opcją jest py-dom-xpath , działa płynnie z minidom i jest czystym Pythonem, więc działa na appengine.
import xpath
xpath.find('//item', doc)
context
in find
pozwala użyć innego wyniku xpath jako nowego kontekstu wyszukiwania.
Możesz użyć:
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
odfrom xml.dom.ext.reader import Sax2
Najnowsza wersja elementtree całkiem dobrze obsługuje XPath. Nie będąc ekspertem XPath, nie jestem pewien, czy implementacja jest pełna, ale spełniła większość moich potrzeb podczas pracy w Pythonie. Korzystam również z lxml i PyXML i uważam, że etree jest fajny, ponieważ jest to standardowy moduł.
UWAGA: Od tamtej pory znalazłem lxml i dla mnie jest to zdecydowanie najlepsza dostępna biblioteka XML dla Pythona. Ładnie radzi sobie także z XPath (choć może nie jest to pełna implementacja).
Możesz użyć prostego soupparser
zlxml
from lxml.html.soupparser import fromstring
tree = fromstring("<a>Find me!</a>")
print tree.xpath("//a/text()")
Jeśli chcesz mieć moc XPATH w połączeniu z możliwością korzystania z CSS w dowolnym momencie, możesz użyć 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()
Inną biblioteką jest 4Suite: http://sourceforge.net/projects/foursuite/
Nie wiem, jak to jest zgodne ze specyfikacjami. Ale działało bardzo dobrze na mój użytek. Wygląda na opuszczony.
PyXML działa dobrze.
Nie powiedziałeś, jakiej platformy używasz, jednak jeśli korzystasz z Ubuntu, możesz to zrobić sudo apt-get install python-xml
. Jestem pewien, że inne dystrybucje Linuksa też to mają.
Jeśli korzystasz z komputera Mac, xpath jest już zainstalowany, ale nie jest od razu dostępny. Możesz ustawić PY_USE_XMLPLUS
w swoim środowisku lub zrobić to w Pythonie przed zaimportowaniem xml.xpath:
if sys.platform.startswith('darwin'):
os.environ['PY_USE_XMLPLUS'] = '1'
W najgorszym przypadku może być konieczne samodzielne zbudowanie go. Ten pakiet nie jest już obsługiwany, ale nadal działa poprawnie i współpracuje z nowoczesnymi Pythonami 2.x. Podstawowe dokumenty są tutaj .