【问题标题】:Why doesn't lxml allow relative XPath expressions on the whole ElementTree?为什么 lxml 不允许在整个 ElementTree 上使用相对 XPath 表达式?
【发布时间】:2020-05-10 21:48:13
【问题描述】:

在 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() 函数示例中可以看出,简单地在字符串的开头放置一个斜杠是行不通的。

【问题讨论】:

  • 您对在线评估器使用哪种表达方式以及不同的输出方式是什么?
  • 如果我没记错的话tree 已经有了TestRootNode 的上下文。对于相对于当前上下文的 xpath,请尝试 tree.xpath('person')(或 tree.xpath('./person'))。
  • @JackFleeting 与上述 Python 语句中的表达式相同。在 xpather.com "/TestRootNode/person" 和 "TestRootNode/person" 中找到 2 个元素。 string(/TestRootNode/person[1]) 和 string(TestRootNode/person[1]) 都找到字符串“James”。
  • 对问题2的澄清:XPath表达式字符串由用户传入。我的程序可以在将字符串传递给 lxml xpath() 函数之前对字符串进行预处理(例如,将相对表达式转换为绝对表达式),但是这种预处理必须是完全自动化的(例如,程序必须自动检测到的位置插入斜线)。

标签: python python-3.x xpath lxml xpath-1.0


【解决方案1】:

谁是对的,在线评估者还是 lxml?

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

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

lxmlclaims to follow the same convention:

对于 ElementTree,xpath 方法针对文档(如果是绝对的)或 针对根节点(如果是相对的)执行全局 XPath 查询

这并不完全正确,因为 根节点 是一种不同于元素节点的特殊节点,而lxml 实际上是针对 根元素 进行评估(@ 987654322@).

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-22
    • 1970-01-01
    相关资源
    最近更新 更多