如何在Python中使用Xpath?

时间:2020-03-05 18:39:09  来源:igfitidea点击:

什么是图书馆?是否有完整的实现?图书馆如何使用?它的网站在哪里?

解决方案

回答

lxml软件包支持xpath。尽管我在self ::轴上遇到了一些麻烦,但它似乎工作得很好。也有Amara,但我还没有亲自使用过。

回答

PyXML运作良好。

我们没有说明正在使用什么平台,但是如果我们在Ubuntu上,则可以使用sudo apt-get install python-xml来获得它。我敢肯定其他Linux发行版也有它。

如果我们使用的是Mac,则xpath已安装但无法立即访问。我们可以在环境中设置" PY_USE_XMLPLUS",或者在导入xml.xpath之前以Python的方式进行设置:

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

在最坏的情况下,我们可能必须自己构建它。该软件包不再维护,但仍然可以正常运行,并且可以与现代2.x Python一起使用。基本文档在这里。

回答

最新版本的elementtree很好地支持XPath。不是XPath专家,我不能肯定实现是否完整,但是在使用Python时它已经满足了我的大多数需求。我也使用了lxml和PyXML,我发现etree很不错,因为它是一个标准模块。

注意:从那以后我就找到了lxml,对我来说,它绝对是Python最好的XML库。它也很好地完成了XPath(尽管可能不是完整的实现)。

回答

libxml2具有许多优点:

  • 符合规范
  • 积极发展和社区参与
  • 速度。这实际上是围绕C实现的python包装器。
  • 无处不在。 libxml2库无处不在,因此经过了充分的测试。

缺点包括:

  • 符合规范。严格在其他库中,诸如默认名称空间处理之类的事情会更容易。
  • 使用本机代码。这可能会很麻烦,具体取决于应用程序的分发/部署方式。可以使用RPM来减轻这种痛苦。
  • 手动资源处理。请注意下面的示例中对freeDoc()和xpathFreeContext()的调用。这不是非常Pythonic。

如果我们要进行简单的路径选择,请坚持使用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

回答

使用LXML。 LXML充分利用了libxml2和libxslt的功能,但是将它们包装在比这些库中固有的Python绑定更多的" Pythonic"绑定中。这样,它将获得完整的XPath 1.0实现。本机ElemenTree支持XPath的有限子集,尽管它可能足以满足需求。

回答

另一个选项是py-dom-xpath,它可以与minidom无缝运行,并且是纯Python,因此可以在appengine上运行。

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

回答

另一个库是4Suite:http://sourceforge.net/projects/foursuite/

我不知道它是如何符合规范的。但这对我来说非常有效。它看起来被遗弃了。

回答

我们可以使用:

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