如何在Python中使用Xpath?

2024-05-21 00:11:12 发布

您现在位置:Python中文网/ 问答频道 /正文


Tags: python
3条回答

lxml package支持xpath。虽然我在self::axis上遇到了一些问题,但它似乎工作得很好。也有Amara,但我没有亲自使用过。

libxml2有许多优点:

  1. 遵守spec
  2. 积极发展和社区参与
  3. 速度。这实际上是一个围绕C实现的python包装器。
  4. 无处不在。libxml2库无处不在,因此经过了很好的测试。

缺点包括:

  1. 遵守spec。这很严格。在其他库中,像默认命名空间处理这样的操作更容易。
  2. 使用本机代码。这可能是一种痛苦,取决于您的应用程序是如何分布/部署的。RPMs可以减轻一些疼痛。
  3. 手动资源处理。注意下面的示例中对freeDoc()和xpathFreeContext()的调用。这不是很Python。

如果您正在进行简单的路径选择,请使用ElementTree(包含在Python 2.5中)。如果您需要完全符合规范或原始速度,并且能够处理本机代码的分发,请使用libxml2。

libxml2xpath使用示例


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()

元素树XPath使用示例


from elementtree.ElementTree import ElementTree
mydoc = ElementTree(file='tst.xml')
for e in mydoc.findall('/foo/bar'):
    print e.get('title').text

听起来像是lxml广告。;)元素树包含在std库中。在2.6及以下版本中,它的xpath相当弱,但是在2.7+ much improved

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

相关问题 更多 >