簡體   English   中英

Python:libxml2 xpath 返回空列表

[英]Python: libxml2 xpath returns empty list

我想使用 xpath 用 Python 的 libxml2 解析 XML 內容,我遵循了這個例子那個教程 XML 文件為:

<?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”的文件中,我嘗試以下操作:

>>> import libxml2
>>> myfile = open('/pathtomyfile/atom', 'r').read()
>>> xmldata = libxml2.parseDoc('myfile')
>>> data.xpathEval('/fullcount')
[]
>>>

現在你可以看到它返回一個空列表。 無論我提供什么 xpath,它都會返回一個空列表。 但是,如果我使用*通配符,我會得到所有節點的列表:

>>>> 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”節點或任何其他節點:畢竟我使用的是相同的語法......

有什么想法或建議嗎? 謝謝。

您的 XPath 失敗,因為您需要在節點上指定 purl命名空間

import libxml2
tree = libxml2.parseDoc(data)
xp = tree.xpathNewContext()
xp.xpathRegisterNs("purl", "http://purl.org/atom/ns#")
print xp.xpathEval('//purl:fullcount')

結果:

[<xmlNode (fullcount) object at 0x7fbbeba9ef80>]

(另外:查看 lxml,它有一個更好、更高級別的界面)。

首先:

/fullcount是一個絕對路徑,因此它會在文檔根目錄中查找<fullcount>元素,而該元素實際上位於<feed>元素中。

第二:

您需要指定命名空間。 這就是使用lxml的方式:

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

這會給你:

<fullcount xmlns="http://purl.org/atom/ns#">1</fullcount>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM