2

我正在尝试解析这个XML。这是一个 YouTube 提要。我正在根据教程中的代码工作。我想获取entry嵌套在feed.

from lxml import etree
root = etree.fromstring(text)
entries = root.xpath("/feed/entry")
print entries

由于某种原因entries是一个空列表。为什么?

4

2 回答 2

4

feed它的所有孩子实际上都在http://www.w3.org/2005/Atom命名空间中。您需要告诉您的 xpath:

entries = root.xpath("/atom:feed/atom:entry", 
                     namespaces={'atom': 'http://www.w3.org/2005/Atom'})

或者,如果要更改默认的空命名空间:

entries = root.xpath("/feed/entry", 
                     namespaces={None: 'http://www.w3.org/2005/Atom'})

或者,如果您根本不想使用短句柄:

entries = root.xpath("/{http://www.w3.org/2005/Atom}feed/{http://www.w3.org/2005/Atom}entry")

据我所知,您正在使用的节点隐含地假定“本地命名空间”,因此对同一命名空间中的子节点的操作不需要您再次设置它。所以你应该能够按照以下方式做一些事情:

feed = root.find("/atom:feed",
                     namespaces={'atom': 'http://www.w3.org/2005/Atom'})

title = feed.xpath("title")
entries = feed.xpath("entries")
# etc...
于 2013-08-21T11:20:58.543 回答
1

这是因为 XML 中的命名空间。这是一个解释:http ://www.edankert.com/defaultnamespaces.html#Conclusion 。

于 2013-08-21T11:16:59.767 回答