我正在尝试解析这个XML。这是一个 YouTube 提要。我正在根据教程中的代码工作。我想获取entry
嵌套在feed
.
from lxml import etree
root = etree.fromstring(text)
entries = root.xpath("/feed/entry")
print entries
由于某种原因entries
是一个空列表。为什么?
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...
这是因为 XML 中的命名空间。这是一个解释:http ://www.edankert.com/defaultnamespaces.html#Conclusion 。