如何在Python中使用XPath?

258 投票
11 回答
382119 浏览
提问于 2025-04-11 09:15

有哪些库可以支持XPath?有没有完整的实现?这个库是怎么使用的?它的网站在哪里?

11 个回答

82

听起来这里在推销lxml呢。;) ElementTree是Python标准库里自带的。在2.6及以下版本,它的xpath功能比较弱,但在2.7及以上版本和3.x中,功能大大增强

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:
    if elem.attrib.get('name') == 'foo':
        result = elem.text
        break
87

lxml包支持xpath。这玩意儿看起来运行得不错,不过我在使用self::轴的时候遇到了一些麻烦。另外还有Amara,不过我个人没有用过它。

137

libxml2 有几个优点:

  1. 符合规范
  2. 活跃的开发和社区参与
  3. 速度快。这其实是一个用C语言实现的库在Python中的封装。
  4. 广泛使用。libxml2库非常普遍,因此经过了充分的测试。

缺点包括:

  1. 符合规范。它的要求很严格,比如处理默认命名空间在其他库中会更简单。
  2. 使用本地代码。这可能会造成一些麻烦,具体取决于你的应用程序是如何分发和部署的。有一些RPM包可以减轻这方面的麻烦。
  3. 手动管理资源。下面的示例中有调用freeDoc()和xpathFreeContext()的地方。这在Python中并不是很优雅。

如果你只是做简单的路径选择,可以使用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

撰写回答