当 <a> XPath 隐藏在另一个标签中时获取文本,例如 <strong>



以下 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')] 可以在上述两个示例中的第一个示例中起作用,但在第二个示例中不起作用的原因。

最新更新