如何使用XPath contains()获取特定文本?

时间:2016-09-22 22:47:23

标签: html xml selenium xpath

假设我们有一个基本上如下的HTML表:

2|1|28|9|
3|8|5|10|
18|9|8|0|

我想选择仅包含8而不包含其他内容的单元格,即只包含第2行的第2个单元格和第3行的第3个单元格。

这就是我尝试过的://table//td[contains(.,'8')]。它给了我所有包含8的单元格。所以,我得到了不需要的值28和18。

我该如何解决这个问题?

编辑:如果你想尝试你的xpath,这是一个示例表。使用左侧的日历 - https://sfbay.craigslist.org/sfc/

2 个答案:

答案 0 :(得分:6)

小心 contains() 功能。

使用它来测试 元素是否包含值 是一种常见的错误真正的作用是测试 字符串是否包含子字符串 。因此,td[contains(.,'8')]采用字符串值td.)并测试它是否包含任何'8' 子字符串。这可能是你想要的,但往往不是。

这个XPath,

//td[.='8']

将选择string-value 等于 td的所有8个元素。

或者,这个XPath,

//td[normalize-space()='8']

将选择normalize-space()字符串值等于 td的所有8个元素。 (normalize-space() XPath函数剥离前导和尾随空格,并用单个空格替换空白字符序列。)

说明:

  • 即使8位于另一个元素(例如a)中,两者都会起作用 abspandiv
  • 两者都 匹配<td>gr8t</td><td>123456789</td>等。
  • 使用normalize-space()将忽略前导空格或尾随空格 围绕8

答案 1 :(得分:2)

尝试使用以下xpath,它将选择整个文本内容而不是部分匹配:

//table//td[text()='8']

编辑:您的示例HTML在td元素中有一个标记,因此以下内容将起作用:

//table//td/a[text()="8"]

请参阅php中的示例:https://3v4l.org/56SBn