我正在尝试使用
e.find('..)'
访问树中元素的父节点,但它不起作用。对于以下代码:
import xml.etree.ElementTree as etree
xml = "<a> <b> </b> </a>"
root = etree.fromstring(xml)
child = root.find('*')
print(child.find('..'))
输出是:
None
,为什么?而且,我怎样才能得到父元素(在本例中是节点<\a>)?
我已经尝试了不同的路径组合并在互联网上进行了搜索,有些解决方案不起作用,有些是针对该问题的。
您的代码片段返回
None
,因为根的父级是根本身。
使用包含 XPath 1.0 实现的 lxml 库:
>>> import lxml.etree as let
>>> doc = let.fromstring("<a> <b> </b> </a>")
>>> doc.xpath('//*[b]') # return all nodes with a direct `b` child
[<Element a at 0x7fffef3ed8c0>]
可以用 ElementTree 获取父级,但不能直接在子级上使用
find()
文档声明:
选择父元素。如果路径试图到达起始元素的祖先(元素..
被调用),则返回None
。find
演示:
import xml.etree.ElementTree as etree
xml = "<a> <b> </b> </a>"
root = etree.fromstring(xml)
child = root.find('*')
# This does not work because we are calling find() on the child element
print(child.find('..')) # None
# This works because we are calling find() on the root element
print(root.find("*/..")) # <Element 'a' at 0x000002088B2B4B30>