xpath中的点(。)如何在识别元素和匹配文本时采用多种形式

How does dot(.) in xpath to take multiple form in identifying an element and matching a text

我有以下 dom 结构:

<h3 class="popover-title">
 <div class="popup-title">
   <div class="title-txt">Associated Elements&nbsp;&nbsp(5)</div>
 </div>
</h3>

我正在尝试编写一个 xpath 来识别 h3 标签下的标题 "Associated Elements"。

当我的 xpath 是

//div[contains(@class, popover)]//h3[contains(.,'Associated Elements')]

元素已识别。

但是当我的 xpath 是

//div[contains(@class, popover)]//h3[contains(text(),'Associated Elements')]

元素未被识别。 根据我的理解,点 (.) 是 text() 的替代品,但是为什么当我使用 text() 函数时它不能识别元素。

但是,对于另一个 dom 结构:

<h3 class="popover-title">
   <a class="btn-popover" href="#">x</a>
   "Associated Elements"
</h3>

xpath :

//div[contains(@class, popover)]//h3[contains(text(),'Associated Elements')]

&

//div[contains(@class, popover)]//h3[contains(.,'Associated Elements')]

工作正常。

有人可以解释点 (.) 在这两种情况下的行为吗?

有没有更好的方法来编写对两个示例都适用的 xpath?请推荐。

contains(text(),'Associated Elements') 中的 text() 是一个 selector 匹配作为上下文节点子节点的所有文本节点 - 它 returns 一个节点集.该节点集被转换为字符串并传递给 contains() 函数。

text() 不是函数而是节点测试。它用于 select 上下文节点的所有文本节点子节点。因此,如果上下文节点是名为 x 的元素,则 text() select 是 x 的所有文本节点子节点。

当您使用 contains(., 'Associated Elements') 时,只有一个单独的文本节点被传递给函数并且它能够唯一匹配文本。

注意:this and this post 复制和编辑。

作为 is tagged so this answer would be based on and the associated XML Path Language (XPath) Version 1.0 规范。


包含(字符串,字符串)

如果第一个参数字符串包含第二个参数字符串,函数 boolean contains(string, string) returns 为真,否则 returns 为假。例如:

//h3[contains(.,'Associated Elements')]

文本节点

字符数据分组到text nodes。尽可能多的字符数据被分组到每个文本节点中。文本节点的string-value是字符数据。一个文本节点总是至少有一个数据字符。在下面的示例中,text() 选择上下文节点的所有文本节点子节点:

//h3[text()='Associated Elements']

在您的用例中,在 HTML 文本 Associated Elements  (5) 中有 &nbsp;这也被称为 fixed spacehard space, NBSP(非breaking space) 用于在编程中创建一个不能被自动换行打断的行中的 space。在 HTML、&nbsp; 中,您可以创建多个 space,它们不仅在源代码中而且在网页上可见。


正在分析您的代码试验

您的第一次代码试用:

//h3[contains(.,'Associated Elements')]

定位元素,因为它成功识别了部分文本关联元素

您的第二次代码试用:

//h3[contains(text(),'Associated Elements')]

失败 因为该元素包含更多字符,例如&nbsp; 除了文本 Associated Elements.


参考

您可以在以下位置找到一些相关讨论: