在我的网页中,有一个 div
和一个名为 Test
的 class
。
如何使用 XPath
找到它?
这个选择器应该可以工作,但如果你用合适的标记替换它会更有效:
//*[contains(@class, 'Test')]
或者,因为我们知道寻找的元素是 div
:
//div[contains(@class, 'Test')]
但由于这也将匹配 class="Testvalue"
或 class="newTest"
之类的情况,@Tomalak 在评论中提供的版本更好:
//div[contains(concat(' ', @class, ' '), ' Test ')]
如果您希望确定它会正确匹配,您还可以使用 normalize-space 函数来清除类名周围的杂散空白字符(如@Terry 所述):
//div[contains(concat(' ', normalize-space(@class), ' '), ' Test ')]
请注意,在所有这些版本中,最好将 * 替换为您实际希望匹配的任何元素名称,除非您希望在文档中搜索给定条件的每个元素。
最简单的方法。。
//div[@class="Test"]
假设您想按照描述找到 <div class="Test">
。
//
而不仅仅是 /
。
使用 XPath 的唯一正确方法是:
//div[contains(concat(" ", normalize-space(@class), " "), " Test ")]
函数 normalize-space
去除前导和尾随空格,并将空白字符序列替换为单个空格。
笔记
如果不需要很多这些 Xpath 查询,您可能希望使用将 CSS 选择器转换为 XPath 的库,因为 CSS 选择器通常比 XPath 查询更容易读写。例如,在这种情况下,您可以使用选择器 div.Test
来获得完全相同的结果。
我能够找到的一些图书馆:
对于 JavaScript:css2xpath 和 css-to-xpath
对于 PHP:CssSelector 组件
对于 Python:cssselect
对于 C#:重新加载 css2xpath
对于 GO:css2xpath
//div[@class[contains(.,'Test')]]
怎么样?
我只是提供这个作为答案,正如托马拉克很久以前作为对 meder 的回答的评论所提供的那样
//div[contains(concat(' ', @class, ' '), ' Test ')]
concat(' ', normalize-space(@class), ' ')
又如何考虑各种空白字符呢?
//div[contains(concat(' ', @class, ' '), ' Test ')]/chid
不选择子项?
XPath 有一个 contains-token 函数,specifically designed 适用于这种情况:
//div[contains-token(@class, 'Test')]
它仅在最新版本的 XPath (3.1) 中受支持,因此您需要最新的实现。
由于 XPath 2.0 有一个标记化功能,您可以使用:
//div[tokenize(@class,'\s+')='Test']
在这里,它将在空白处进行标记,然后将生成的字符串与“测试”进行比较。
它是 XPath 3.1 函数 contains-token() 的替代方案
但是目前(2021-04-30)没有浏览器支持 XPath 2.0 或更高版本。
//div[@class[contains(.,'Test')]]
这就是我在我目前的项目中使用的,它工作顺利。
表达式中的点 .
表示任何 div
元素的 class
属性的值。所以您不需要使用 normalize-space
和 concat
。请注意,这也可能会选择类名 XXXTestXXX
的 div。我碰巧将我的可搜索类设置为 infobox-header
,并且该页面没有类似 XXinfobox-headerXXXX
的任何内容。
匹配一个有空格的类。
<div class="hello "></div>
//div[normalize-space(@class)="hello"]
不定期副业成功案例分享
//div[contains(concat(' ', @class, ' '), ' Test ')]
- 你的也会出现部分匹配。