【问题标题】:XPath //div[contains(text(), 'string')] fails to select divs containing 'string'XPath //div[contains(text(), 'string')] 无法选择包含 'string' 的 div
【发布时间】:2014-11-29 23:40:25
【问题描述】:

这是 HTML 代码:

<div>  <span></span>  Elangovan  </div>

我想根据其包含的文本为div 编写一个XPath。我试过了

//div[contains(text(),'Elangovan')]

但这不起作用。

【问题讨论】:

    标签: html xpath


    【解决方案1】:

    text() 替换为string()

    //div[contains(string(), "Elangovan")]
    

    或者,您可以检查span 的以下文本兄弟是否包含该文本:

    //div[contains(span/following-sibling::text(), "Elangovan")] 
    

    另见:

    【讨论】:

    • @alecxe 先生,你是我的英雄!最后我可以选择像

      Hello World

      这样的文本
    【解决方案2】:

    除了 alecxe 的正确答案 (+1) 之外,以下稍微简单且更惯用的 XPath 将以相同的方式工作:

    //div[contains(., "Elangovan")]
    

    您原来的带有text() 的XPath 不起作用的原因是text() 将选择div 的所有文本节点子节点。然而,contains() 在它的第一个参数中需要一个字符串,并且当给定一个文本节点的节点集时,它只使用第一个。在这里,第一个文本节点包含空格,而不是想要的字符串,因此测试失败。使用隐式. 或显式string() 第一个参数,在执行contains() 测试之前将所有文本节点后代连接在一起,因此测试通过。

    【讨论】:

    • 加一,很详细的解释!
    【解决方案3】:

    为了使@kjhughes 已经很好的答案更加精确,您真正需要的是一种在divstring-value 中查找子字符串的方法:

    对于每种类型的节点,都有一种确定字符串值的方法 对于该类型的节点。对于某些类型的节点,字符串值是 节点的一部分;对于其他类型的节点,字符串值为 根据后代节点的字符串值计算。

    上下文节点(.div 本身)和text() 返回的节点集——或任何其他参数! -- 在传递给contains 时首先转换为字符串。只是它们以不同的方式转换,因为一个指的是单个元素,另一个指的是节点集。

    单个元素的字符串值是其所有文本节点后代的字符串值的串联。另一方面,节点集的字符串值是集合中按文档顺序排在第一位的节点的字符串值。

    因此,真正的区别在于您要转换为字符串的内容以及转换的发生方式。

    【讨论】:

    • @lwburk 提​​供的字符串值链接和解释是有价值的贡献,值得理解。 +1
    猜你喜欢
    • 2017-08-10
    • 1970-01-01
    • 1970-01-01
    • 2016-10-16
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多