Python lxml iterfind w / namespace但是prefix = None

时间:2011-06-24 00:14:56

标签: python lxml xml-namespaces

我想对具有命名空间但没有前缀的元素执行iterfind()。我想致电

iterfind([tagname])iterfind([tagname], [namespace dict])

我不想每次都按照以下方式输入标签:

"{%s}tagname" % tree.nsmap[None]

详情

我正在使用Google API的xml响应。根节点定义了几个名称空间,包括没有前缀的名称空间:xmlns="http://www.w3.org/2005/Atom"

看起来当我尝试搜索我的etree时,一切都像我期望的那样具有前缀的元素。 e.g:

>>> for x in root.iterfind('dxp:segment'): print x
...
<Element {http://schemas.google.com/analytics/2009}segment at 0x1211b98>
<Element {http://schemas.google.com/analytics/2009}segment at 0x1211d78>
<Element {http://schemas.google.com/analytics/2009}segment at 0x1211a08>
>>>

但是当我尝试搜索没有前缀的内容时,搜索不会自动添加root.nsmap[None]的命名空间。 e.g:

>>> for x in root.iterfind('entry'): print x
...
>>>

即使我尝试将命名空间映射作为iterfind的可选参数抛出,它也不会附加命名空间。

1 个答案:

答案 0 :(得分:3)

试试这个:

for x in root.iterfind('{http://www.w3.org/2005/Atom}entry'):
    print x

有关详情:请阅读文档:http://lxml.de/tutorial.html#namespaces

如果您不想输入,并且想要提供命名空间映射,则必须使用前缀,例如:

nsmap = {'atom': 'http://www.w3.org/2005/Atom'}
for x in root.iterfind('atom:entry', namespaces=nsmap):
    print x

(如果你想使用xpath也一样)

文档中使用的前缀(如果有)并不重要,它是关于您指定元素的完全限定名称,使用大括号表示法将URI写成完整的URI,或使用映射的前缀到一个URI。