【发布时间】:2020-05-10 21:48:13
【问题描述】:
在 Windows 上运行 Python 3.7.4,我注意到 XPath 评估与在线评估器的结果不同,例如 here 或 here。
在线求值器允许输入一个相对表达式,该表达式将在整个文档上求值。但是,使用 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])')
''
我有两个问题:
谁是对的,在线评估者还是 lxml?是否允许在整个文档的上下文中应用相对表达式?
如果在线评估员是对的:有没有一种简单的方法可以使 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