如何在Python中使用XPath?
有哪些库可以支持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
137
libxml2 有几个优点:
- 符合规范
- 活跃的开发和社区参与
- 速度快。这其实是一个用C语言实现的库在Python中的封装。
- 广泛使用。libxml2库非常普遍,因此经过了充分的测试。
缺点包括:
- 符合规范。它的要求很严格,比如处理默认命名空间在其他库中会更简单。
- 使用本地代码。这可能会造成一些麻烦,具体取决于你的应用程序是如何分发和部署的。有一些RPM包可以减轻这方面的麻烦。
- 手动管理资源。下面的示例中有调用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