【问题标题】:Selecting elements based on string/text matching in XPath?基于 XPath 中的字符串/文本匹配选择元素?
【发布时间】:2016-07-07 19:00:16
【问题描述】:

对于网页上的 HTML 表格,我使用以下 XPath:

/tr/td[2]/.[contains(text(),'Some')]  

这在所有情况下都可以正常工作,但它也匹配“某事”。

/tr/td[2]/.[normalize-space(text()) = 'Some']

并非在所有情况下都有效。 有人可以评论后者的 XPath 有什么问题吗?

【问题讨论】:

  • 后一条路径没有问题。请提供一个 HTML 代码示例,其中给定的 XPath 无法按您的预期工作。否则很难帮到你。
  • @ThomasW:实际上,两个 XPath 的格式都不正确:可能 OP 打算使用 * 而不是 .。但除此之外,我同意问题可能与normalize-space() 无关。详情请见my answer below
  • @user2764578:在 2 年内提出 12 个问题而没有接受一个答案,这表明您应该阅读 How does accepting an answer work? 并且可能还阅读 How to Ask。谢谢。

标签: html xml xpath


【解决方案1】:

您的问题不太可能涉及normalize-space(),而是两个常见的文本/字符串匹配混淆区域之一:

文本节点与字符串值

text() 匹配文本节点。

//td[contains(text(), 'Some')] 将匹配此

<td>Some text</td>

但不是

<td><b>Some text</b></td>

要匹配后者,请改用//td[contains(., 'Some')]。这将检查td字符串值 是否包含字符串“Some”。

更多详情请见XPath text() = is different than XPath . =

字符串包含 vs 字符串等于

还要注意contains() 测试子字符串包含。如果您想要字符串相等,请对字符串使用 = 运算符:

//td[. = 'Some']

会匹配

<td><b>Some</b></td>

但不是

<td><b>Some text</b></td>

注意区别。

【讨论】:

  • 我有 一些 .. 所以我认为'.'在这里不起作用,我试过 [normalize-space(text()) = 'Some'] ..但它不起作用
  • 停止猜测,让我们猜测。提供真实的minimal reproducible example,否则 Thomas W 是对的:无法帮助您。
猜你喜欢
  • 2012-03-24
  • 1970-01-01
  • 1970-01-01
  • 2015-01-10
  • 1970-01-01
  • 1970-01-01
  • 2020-05-24
  • 2023-03-06
  • 2013-02-04
相关资源
最近更新 更多