以下 XPath 通常足以匹配文本包含特定字符串的所有 anchor :
//a[contains(text(), 'SENIOR ASSOCIATES')]
考虑到这样的情况:
<a href="http://www.freshminds.net/job/senior-associate/"><strong>
SENIOR ASSOCIATES <br>
</strong></a>
文本被包裹在 <strong>
中,还有一个<br>
在 anchor 关闭之前,因此上面的 XPath 不会返回任何内容。
如何调整 XPath 以便允许 <a>
包含其他标签,例如 <strong>
, <i>
, <b>
, <br>
等等,同时仍在标准情况下工作?
最佳答案
不要使用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 个或多个节点组成)转换为字符串是通过连接集合中第一个节点的所有文本节点后代来完成的(*)。因此使用.
(或更明确的等效 string(.)
)给你 SENIOR ASSOCIATES
被一堆空格包围,因为 XML 中有一堆空格。
要消除该空格,请使用 normalize-space()
功能:
//a[contains(normalize-space(.), 'SENIOR ASSOCIATES')]
或者更短,因为“当前节点”是此函数的默认值:
//a[contains(normalize-space(), 'SENIOR ASSOCIATES')]
(*) 这就是为什么使用 //a[contains(.//text(), 'SENIOR ASSOCIATES')]
的原因可以在上面两个示例中的第一个示例中工作,但在第二个示例中不起作用。
关于html - 当 <a> 埋在另一个标签中时,使用 XPath 获取它的文本,例如<强>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35183798/