python3 lxml如何在前缀为空时找到节点?

时间:2016-03-29 09:51:43

标签: python xml lxml

word/_rels/document.xml.rels文件中的.docx有一个空的preifx命名空间元素:<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">会导致我无法使用findall mehtod获取儿童节点。

简化示例:

>>> from lxml import etree
>>> etree.fromstring(b'<x><y id="1"/><y id="2"/></x>').findall('y')
[<Element y at 0x382d788>, <Element y at 0x382db48>]
>>> etree.fromstring(b'<x xmlns="wow"><y id="1"/><y id="2"/></x>').findall('y')
[]
# How to find these children nodes like previous one?

1 个答案:

答案 0 :(得分:1)

如果您使用lxml的{​​{1}}方法,则应与using the built-in xml.etree.ElementTree相同,再加上另一个选项:

xpath()

请注意,没有前缀的后代元素会隐式地继承祖先的默认命名空间 ,这就是为什么在选择>>> from lxml import etree >>> root = etree.fromstring(b'<x xmlns="wow"><y id="1"/><y id="2"/></x>') >>> root.findall('{wow}y') [<Element {wow}y at 0x2b489c8>, <Element {wow}y at 0x2b48588>] >>> ns = {'d': 'wow'} >>> root.findall('d:y', ns) [<Element {wow}y at 0x2b489c8>, <Element {wow}y at 0x2b48588>] >>> root.xpath('d:y', namespaces=ns) [<Element {wow}y at 0x2b489c8>, <Element {wow}y at 0x2b48588>] 时需要考虑命名空间,尽管在父元素{{1}处声明了命名空间}。