3

.net 上的 xpath 和 python 中的 sax 的忠实粉丝,但第一次在 python 中使用 xpath。

我有一个小脚本,它使用 xpath 从文档中选择一些节点,遍历它们,然后理想地再次使用 xpath 从它们那里获取相关数据。但是,我无法获得最后一点,一旦我拥有 xmlNode,我就无法从中获取上下文。

import libxml2
import urllib

doc = libxml2.parseDoc(
        urllib.urlopen('http://somemagicwebservice.com/').read())
ctxt = doc.xpathNewContext()
listitems = ctxt.xpathEval('//List/ListItem')
for item in listitems:
    itemctxt = item.xpathNewContext()
    title = itemctxt.xpathEval('//ItemAttributes/Title')
    asin = itemctxt.xpathEval('//Item/ASIN')
    itemctxc.xpathFreeContext()
ctxt.xpathFreeContext()
doc.freeDoc()

但是该itemctxt = item.xpathNewContext()位失败了

itemctxt = item.xpathNewContext()
AttributeError: xmlNode instance has no attribute 'xpathNewContext'

任何想法如何在 xmlNode 上使用 xpath?我找不到任何好的在线信息。谢谢

4

2 回答 2

2

我认为 XPathContext 对元素没有意义?尝试创建一个新的 XPathContext,并将其节点设置为当前元素。

也就是说,我没有直接使用过 libxml2,所以这有点疯狂。我通常使用 lxml,它公开了一个围绕 libxml2 和 libxslt 的 ElementTree API。它更容易使用,并且确实允许在元素上使用 xpath()。当然,如果您已经有很多使用 libxml2 的代码,您可能不想切换,但在这种情况下,您可能需要查看 lxmls 源代码以了解它是如何实现的。

http://codespeak.net/svn/lxml/trunk/src/lxml/xpath.pxi

http://codespeak.net/svn/lxml/trunk/src/lxml/_elementpath.py

似乎是不错的起点。

于 2009-07-05T14:06:19.407 回答
2

https://stackoverflow.com/a/3379708/288875建议调用setContextNode(..)新创建的上下文:

itemctxt = doc.xpathNewContext()

for item in listitems:
    itemctxt.setContextNode(item)
    title = itemctxt.xpathEval('.//ItemAttributes/Title')

    ...

itemctxt.xpathFreeContext()

在我目前使用的 python libxml (2.9.1) 版本中,甚至可以调用:

item.xpathEval('.//ItemAttributes/Title')

请注意,您必须在 xpath 表达式的开头添加一个点.//(而不是//),否则您将获得相对于文档根目录的搜索结果。

于 2015-09-17T11:20:23.947 回答