【问题标题】:XML - XPath to return element that brother element contains certain textXML - XPath 返回兄弟元素包含某些文本的元素
【发布时间】:2020-09-27 16:50:14
【问题描述】:

我正在尝试找到正确的 xpath 表达式来选择包含特定文本的元素的父级。

在下面的示例中,我想选择文本匹配“4”或任何其他数字的“span”元素,并且父元素与文本“Rooms”匹配:

我的 XPath 示例 - 匹配“div”元素内的每个“span”

//div/span[../span[contains(text(), 'Rooms')]]

源代码

<div>
    <span>4</span>
    <span>Rooms</span>
    <span>and 2 suites</span>
</div>

我想要的是选择包含数字四的“span”元素作为文本,但由于 html 可能会发生变化,并且可能只有两个或一个“span”元素,如下例所示:

<div>
    <span>2 Rooms</span>
</div>

<div>
    <span>3</span>
    <span>Rooms</span>
</div>

【问题讨论】:

    标签: html xml firefox xpath scrapy


    【解决方案1】:

    这个 XPath

    //span[contains(.," Rooms") or following-sibling::*[1][self::span]="Rooms"]
    

    将选择字符串值包含“Rooms”的span,或者其紧随其后的span 兄弟的字符串值等于“Rooms”。

    【讨论】:

    • 我想选择包含“Rooms”数值的span元素(span之前的元素匹配“Rooms”值)
    • 我修正了一个错误,抱歉。我想你会发现它运作良好并且相当短。如果您需要考虑其他变化,可以轻松扩展。
    【解决方案2】:

    试试这个 XPath-1.0 表达式:

    //div/span[contains(text(), 'Rooms')]/preceding-sibling::span[1] | div[count(span)=1 and contains(span/text(), 'Rooms')]/span
    

    它将包含文本“Rooms”的spans 的前兄弟节点集与第一个span 元素(如果它是唯一的一个元素(count=1))合并。

    结果是:

    <span>4</span>
    <span>2 Rooms</span>
    <span>3</span>
    

    【讨论】:

    • 正如我在上面的答案中所说,我想在匹配“Rooms”值的 span 之前选择 span 元素。
    • 正如您在结果中看到的那样,我的表达确实实现了这一点。它选择带有“房间”的&lt;span&gt; 之前的数字&lt;span&gt;。但如果只有一个 &lt;span&gt; 元素,它会检查它是否包含“房间”,如果是,则选择它。
    • 哦抱歉,我刚刚用错误的参数测试,这是我的错误,作为一个魅力,谢谢!
    猜你喜欢
    • 1970-01-01
    • 2018-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-02
    • 2016-08-26
    相关资源
    最近更新 更多