gpt4 book ai didi

python - 如何使用 XPath lxml Python 选择直接子项?

转载 作者:行者123 更新时间:2023-11-30 22:43:16 25 4
gpt4 key购买 nike

我正在做一些 lxml 代码,但不明白两者之间有什么区别 - 我想选择直接在父级下面的子级:

 xml = '<parent><child></child><parent>'
root = lxml.etree.fromstring(xml)

root.xpath('child')

和“./child”:

 root.xpath('child')

最佳答案

在这种情况下,表达式 child./child 给出相同的结果。这是因为 child 隐式假定一个上下文节点,在 XPath 中称为 .。要查看 Python/lxml/文档中的上下文节点是什么,只需评估 . 即可。更正 XML 文档中可能导致格式良好错误的拼写错误后:

>>> xml = '<parent><child></child></parent>'
>>> root = lxml.etree.fromstring(xml)
>>> root.xpath('.')
[<Element parent at 0x1038446c8>]

如您所见,parent 元素是针对此文档计算的任何 XPath 表达式的隐式上下文。

但是 ./ 并不总是可以从表达式中省略,有些情况下这是必要的。例如,如果您想搜索除上下文节点之外的元素的所有后代,您可以使用 .//descendant//descendant 可能会导致错误结果。

举个例子,假设您想要查找一个 other 元素(如果它是 child 元素的后代),否则不查找。您的文档可能如下所示:

>>> xml = '<parent><other find="no"/><child><other find="yes"/></child></parent>'
>>> root = lxml.etree.fromstring(xml)

您首先要查找元素:

>>> child = root.xpath('child')[0]

然后使用此元素作为上下文来计算 XPath 表达式:

>>> child.xpath('//other')
[<Element other at 0x1038446c8>, <Element other at 0x105380348>]
>>> child.xpath('.//other')
[<Element other at 0x105380348>]

在这种情况下,XPath 表达式开头的 . 实际上会对结果列表产生影响,只有 .//other 返回正确的结果.

关于python - 如何使用 XPath lxml Python 选择直接子项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41832679/

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