Які бібліотеки підтримують Xpath? Чи є повна реалізація? Як використовується бібліотека? Де знаходиться його веб-сайт?
Які бібліотеки підтримують Xpath? Чи є повна реалізація? Як використовується бібліотека? Де знаходиться його веб-сайт?
Відповіді:
libxml2 має ряд переваг:
До недоліків належать:
Якщо ви робите простий вибір шляху, дотримуйтесь ElementTree (який входить до Python 2.5). Якщо вам потрібна повна специфікація або швидкість, і ви можете впоратися з розповсюдженням нативного коду, перейдіть до libxml2.
Зразок 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()
Зразок використання 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
Пакет lxml підтримує xpath. Здається, це працює досить добре, хоча у мене були проблеми з self :: axis. Також є Amara , але я не використовував її особисто.
Тут звучить реклама lxml. ;) ElementTree включено до бібліотеки std. Під 2.6 і нижче його xpath досить слабкий, але в 2.7+ значно покращений :
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
Використовуйте LXML. LXML використовує повну потужність libxml2 та libxslt, але вкладає їх у більше "пітонічні" прив'язки, ніж зв'язки Python, які є рідними для цих бібліотек. Таким чином, він отримує повну реалізацію XPath 1.0. Native ElemenTree підтримує обмежений набір XPath, хоча це може бути досить добре для ваших потреб.
Інший варіант - py-dom-xpath , він працює з minidom і є чистим Python, тому працює на аппенгіні.
import xpath
xpath.find('//item', doc)
context
У find
функції дозволяють використовувати інший результат XPATH в якості нового пошуку контексту.
Ви можете використовувати:
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
відfrom xml.dom.ext.reader import Sax2
Остання версія елемента дерева досить добре підтримує XPath. Не будучи експертом XPath, я не можу сказати точно, чи реалізація повна, але вона задовольнила більшість моїх потреб під час роботи в Python. Я також використовую lxml та PyXML, і мені здається, що etree є приємним, оскільки це стандартний модуль.
ПРИМІТКА: з тих пір я знайшов lxml і для мене, безумовно, найкраща XML-версія для Python. Це добре також робить XPath (хоча, можливо, не повну реалізацію).
Ви можете використовувати простий soupparser
зlxml
from lxml.html.soupparser import fromstring
tree = fromstring("<a>Find me!</a>")
print tree.xpath("//a/text()")
Якщо ви хочете мати потужність XPATH у поєднанні з можливістю також використовувати CSS в будь-якій точці, яку ви можете використовувати 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()
Ще одна бібліотека - це 4Suite: http://sourceforge.net/projects/foursuite/
Я не знаю, наскільки це відповідає специфікаціям. Але це дуже добре спрацювало для мого використання. Це виглядає покинутим.
PyXML працює добре.
Ви не сказали, якою платформою ви користуєтесь, однак якщо ви перебуваєте на Ubuntu, ви можете отримати її sudo apt-get install python-xml
. Я впевнений, що в інших дистрибутивах Linux це також є.
Якщо ви перебуваєте на Mac, xpath уже встановлений, але не одразу доступний. Ви можете встановити PY_USE_XMLPLUS
у своєму оточенні або зробити це способом Python, перш ніж імпортувати xml.xpath:
if sys.platform.startswith('darwin'):
os.environ['PY_USE_XMLPLUS'] = '1'
У гіршому випадку вам, можливо, доведеться це будувати самостійно. Цей пакет більше не підтримується, але все ще створює чудово і працює з сучасними піксетами 2.x. Основні документи тут .