gpt4 book ai didi

python - 为什么 lxml 不允许在整个 ElementTree 上使用相对 XPath 表达式?

转载 作者:行者123 更新时间:2023-12-04 01:34:55 26 4
gpt4 key购买 nike

在 Windows 上运行 Python 3.7.4,我注意到 XPath 评估与在线评估器的结果不同,例如 herehere .

在线评估器允许输入一个相对表达式,该表达式将在整个文档上进行评估。但是,使用 lxml 时,我无法在元素树上找到任何匹配项,除非我通过在前面添加斜杠使其成为绝对表达式。

Python 3.7.4 (tags/v3.7.4:e09359112e, Jul  8 2019, 20:34:20) [MSC v.1916 64 bit (AMD64)] on win32
>>> import lxml.etree
>>> root = lxml.etree.fromstring('''
... <TestRootNode>
... <person personID="person1">
... <name>James</name>
... </person>
... <person personID="person2">
... <name>Cathy</name>
... </person>
... </TestRootNode>''')
>>> tree = root.getroottree()
>>> tree.xpath('/TestRootNode/person')
[<Element person at 0x2ceee1f4e88>, <Element person at 0x2ceee1ff048>]
>>> tree.xpath('string(/TestRootNode/person[1])')
'\n James\n '
>>> tree.xpath('TestRootNode/person')
[]
>>> tree.xpath('string(TestRootNode/person[1])')
''

我有两个问题:

  1. 谁是对的,在线评估者还是 lxml?是否允许在整个文档的上下文中应用相对表达式?

  2. 如果在线评估者是正确的:是否有一种简单的方法可以使 lxml 以相同的方式运行?正如您在我的 string() 函数示例中看到的那样,简单地在字符串的开头放置一个斜杠是行不通的。

最佳答案

Who is right, the online evaluators or lxml?

对于相对表达式,不完全清楚应该在哪个上下文中计算它们。不同的工具有不同的假设。

您测试的在线工具可能会在文档节点(代表整个文档)的上下文中计算相对表达式。文档节点将文档的最外层元素作为其唯一的子元素。

lxml claims to follow the same convention :

For ElementTree, the xpath method performs a global XPath query against the document (if absolute) or against the root node (if relative)

这不完全正确,因为 root node 是一种不同于元素节点的特殊节点,而 lxml 实际上是针对 root element ( as Daniel Haley has pointed out as well ).

>>> root = lxml.etree.fromstring('<root><child/></root>')
>>> root.xpath("child")
[<Element child at 0x10c093fc8>]

关于python - 为什么 lxml 不允许在整个 ElementTree 上使用相对 XPath 表达式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59898605/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com