以下 XPath 通常足以匹配文本包含特定字符串的所有锚点:
//a[contains(text(), 'SENIOR ASSOCIATES')]
不过,给定这样的情况:
<a href="http://www.freshminds.net/job/senior-associate/"><strong>
SENIOR ASSOCIATES <br>
</strong></a>
文本换行在<strong>
中,在锚点关闭之前还有一个<br>
,因此上面的 XPath 不返回任何内容。
如何调整 XPath,使其允许包含附加标签(如<strong>
、<i>
、<b>
、<br>
等(的<a>
,同时仍可在标准情况下工作?
不要使用 text()
.
//a[contains(., 'SENIOR ASSOCIATES')]
与您可能认为的相反,text()
不会为您提供元素的文本。
它是一个节点测试,即选择实际节点列表(!(的表达式,即元素的文本节点子级。
这里:
<a href="http://www.freshminds.net/job/senior-associate/"><strong>
SENIOR ASSOCIATES <br>
</strong></a>
没有 a
的文本节点子节点。所有文本节点都是 strong
的子节点。所以text()
给你零节点。
这里:
<a href="http://www.freshminds.net/job/senior-associate/"> <strong>
SENIOR ASSOCIATES <br>
</strong></a>
有一个文本节点子节点 a
。它是空的(如"仅空格"(。
另一方面,.
只选择一个节点(上下文节点,<a>
本身(。
现在,contains()
期望字符串作为其参数。如果一个参数不是字符串,则首先完成对字符串的转换。
将节点集(由 1 个或多个节点组成(转换为字符串是通过连接 set(*( 中第一个节点的所有文本节点后代来完成的。因此,使用 .
(或其更明确的等效string(.)
(会使SENIOR ASSOCIATES
被一堆空格包围,因为 XML 中有一堆空格。
要删除该空格,请使用 normalize-space()
函数:
//a[contains(normalize-space(.), 'SENIOR ASSOCIATES')]
或者,更短,因为"当前节点"是此函数的默认值:
//a[contains(normalize-space(), 'SENIOR ASSOCIATES')]
(*( 这就是为什么使用 //a[contains(.//text(), 'SENIOR ASSOCIATES')]
可以在上述两个示例中的第一个示例中起作用,但在第二个示例中不起作用的原因。