html - 当 <a> 埋在另一个标签中时,使用 XPath 获取它的文本,例如<强>

标签 html xml xpath xhtml

以下 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/

相关文章:

python - Odoo 10 - Many2one 过滤 xml

python - Selenium Python 按文本/样式单击页面上的链接

r - 使用R和XML包进行Web爬取

ios - html5 表单验证在 iOS UIWebView 中不起作用

c# - .NET XmlSerializer 和多维数组

java - 手动构建节点树: how do I rename <ObjectNode> tags

java - Selenium Webdriver - 无法使用 css 或 xpath 进行搜索,但可以使用 'by id' 或 'by class' 进行搜索

javascript - 几秒后切换 JavaScript OnClick 函数

php - 使用 PHP 根据数据库条目突出显示表中的单元格

javascript - 剑道格动态编辑