使用 XPath 查找最前面的元素

Posted

技术标签:

【中文标题】使用 XPath 查找最前面的元素【英文标题】:Find top-most following elements with XPath 【发布时间】:2022-01-24 00:36:57 【问题描述】:

在 XPath 中,我知道我可以使用 /following::* 选择所有后续元素,但是我想避免同时选择包含在任何后续元素中的子元素。

例如,给定这个文档:

<body>
    <div id="div1">
        <p id="p1">...</p>
        <p id="p2">
            <span id="span1"></span>
            <span id="span2"><i id="i1">...</i></span>
        </p>
        <p id="p3">...</p>
    </div>
    <div id="div2">
        <p id="p4">...</p>
        <p id="p5">...</p>
    </div>
</body>

如果我选择了span1,我想选择span2(但不是i1)、p3div2(但不是p4p5)。

在 Python 中,我的代码可能类似于:

>>> lxml.html.fromstring(document).xpath('//*[@id="span1"]/following::*')
[<Element span at 0x1082bd680>,
 <Element i at 0x1082bd4f0>,
 <Element p at 0x1082bd770>,
 <Element div at 0x1082bd360>,
 <Element p at 0x1082bd7c0>,
 <Element p at 0x1082bdef0>]

但我想要返回的是:

[<Element span at 0x1082bd680>,
 <Element p at 0x1082bd770>,
 <Element div at 0x1082bd360>]

编辑:@kjhughes 的回答让我成功了 90%。因为现实生活中的示例可能没有我可以轻松使用的 ID 来匹配,所以我最终编写了如下代码:

find_following = lxml.html.etree.XPath(
    "following::*[not(../preceding::*[. = node()])]"
)

【问题讨论】:

【参考方案1】:

这个 XPath,

//*[@id="span1"]/following::*[not(../preceding::*[@id="span1"])]

选择目标span元素后面的元素,其父元素没有目标span元素作为前驱元素,

<span id="span2"><i id="i1">...</i></span>
<p id="p3">...</p>
<div id="div2"> <p id="p4">...</p> <p id="p5">...</p> </div>

根据要求。

【讨论】:

谢谢!如果我想创建一个函数来获取一个元素,然后选择所有后续元素而不选择任何子元素,你认为这样的事情是否也可以工作:./following-sibling::* | ./following::*[not(../preceding::*)]? (在我的实际代码中,我真的没有可以轻松查询的 ID) 如果这对您的实际代码更有效,那就太好了。如果您遇到任何问题,请告诉我。【参考方案2】:

XPath 3.1 具有函数outermost()outermost(following::*) 选择所有后续元素,不包括节点集中另一个元素的后代。

XPath 2.0 允许following::* except following::*/descendant::*

在 XPath 1.0 中,您可以将 ($A except $B) 表示为 $A[count(.|$B)=count($B)]。 (虽然这并不是很有用,因为 XPath 本身无法绑定变量)。

【讨论】:

以上是关于使用 XPath 查找最前面的元素的主要内容,如果未能解决你的问题,请参考以下文章

一个关于Selenium元素定位多个元素的问题

使用webdriver查找元素时如何在xpath中使用撇号(')?

selenium--find_element_by_xpath()方法汇总

Selenium 在不使用 XPath 的情况下从已经给定的元素中查找近元素

使用 html agility xpath 查找 webdriver 元素

python - 查找包含字符串的元素的xpath