首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python: libxml2 xpath返回空列表

问Python: libxml2 xpath返回空列表
EN

Stack Overflow用户
提问于 2011-05-05 06:18:18
回答 2查看 2.1K关注 0票数 0

我想用Python的libxml2解析XML内容,我使用了this example和that tutorial。XML文件是:

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://purl.org/atom/ns#" version="0.3">
<title>Gmail - Inbox for myemailaddress@gmail.com</title>
<tagline>New messages in your Gmail Inbox</tagline>
<fullcount>1</fullcount>
<link rel="alternate" href="http://mail.google.com/mail" type="text/html"/>
<modified>2011-05-04T18:56:19Z</modified>
</feed>

这个XML存储在一个名为"atom“的文件中,我尝试执行以下操作:

代码语言:javascript
复制
>>> import libxml2
>>> myfile = open('/pathtomyfile/atom', 'r').read()
>>> xmldata = libxml2.parseDoc('myfile')
>>> data.xpathEval('/fullcount')
[]
>>>

现在,正如您所看到的,它返回一个空列表。无论我为xpath提供什么,它都会返回一个空列表。但是,如果我使用*通配符,我会得到所有节点的列表:

代码语言:javascript
复制
>>>> data.xpathEval('//*')
[<xmlNode (feed) object at 0xb73862cc>, <xmlNode (title) object at 0xb738650c>, <xmlNode (tagline) object at 0xb73865ec>, <xmlNode (fullcount) object at 0xb738660c>, <xmlNode (link) object at 0xb738662c>, <xmlNode (modified) object at 0xb738664c>]

现在,从上面的工作示例来看,我不明白为什么xpath找不到"fullcount“节点或其他节点:毕竟我使用的是相同的语法……

有什么想法或建议吗?谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-05-05 06:32:54

您的XPath失败了,因为您需要在节点上指定purl名称空间:

代码语言:javascript
复制
import libxml2
tree = libxml2.parseDoc(data)
xp = tree.xpathNewContext()
xp.xpathRegisterNs("purl", "http://purl.org/atom/ns#")
print xp.xpathEval('//purl:fullcount')

结果:

代码语言:javascript
复制
[<xmlNode (fullcount) object at 0x7fbbeba9ef80>]

(另外:查看lxml,它有一个更好的、更高级别的接口)。

票数 2
EN

Stack Overflow用户

发布于 2011-05-05 06:25:33

首先是:

/fullcount是一个绝对路径,所以它在文档的根中查找<fullcount>元素,而该元素实际上在<feed>元素中。

其次是:

您需要指定命名空间。这就是如何使用来完成此操作

代码语言:javascript
复制
import lxml.etree as etree

tree = etree.parse('/pathtomyfile/atom')

fullcounts = tree.xpath('//ns:fullcount',
                namespaces={'ns': "http://purl.org/atom/ns#"})

print etree.tostring(fullcounts[0])

将为您提供的:

代码语言:javascript
复制
<fullcount xmlns="http://purl.org/atom/ns#">1</fullcount>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5890521

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档