如何通过带有XPath的CSS类找到元素?

时间:2009-10-22 00:57:20

标签: html css xml xpath

在我的网页中,有一个名为div的{​​{1}} class

如何使用Test找到它?

9 个答案:

答案 0 :(得分:386)

此选择器应该可以工作,但如果用适当的标记替换它会更有效:

//*[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 ')]

请注意,在所有这些版本中,*最好用您实际希望匹配的任何元素名称替换,除非您希望在给定条件的文档中搜索每个元素。

答案 1 :(得分:124)

最简单的方式..

//div[@class="Test"]

假设您想要按照描述找到<div class="Test">

答案 2 :(得分:23)

我只是提供这个作为答案,正如Tomalak在很久以前作为对meder的答案的评论而提供的

//div[contains(concat(' ', @class, ' '), ' Test ')]

答案 3 :(得分:17)

使用XPath执行此操作的 ONLY 正确方法:

//div[contains(concat(" ", normalize-space(@class), " "), " Test ")]

函数normalize-space剥离前导和尾随空格,并用单个空格替换空白字符序列。

注意

如果不需要许多这些Xpath查询,您可能希望使用将CSS选择器转换为XPath的库,因为CSS选择器通常比XPath查询更容易读写。例如,在这种情况下,您可以使用div[class~="foo"]div.foo来获得相同的结果。

我能找到的一些图书馆:

答案 4 :(得分:1)

以前的答案可以提供有用的功能:

function matchClass($className) {
    return "[contains(concat(' ', normalize-space(@class), ' '), ' $className ')]";
}

然后将函数调用连接到查询中。

答案 5 :(得分:1)

XPath具有容器令牌功能,specifically designed用于这种情况:

//div[contains-token(@class, 'Test')]

只有最新版本的XPath(3.1)支持它,因此您需要最新的实现。

答案 6 :(得分:0)

与具有空格的一个类匹配。

<div class="hello "></div>
//div[normalize-space(@class)="hello"]

答案 7 :(得分:0)

从 XPath 2.0 开始,您可以使用标记化函数:

//div[tokenize(@class,'\s+')='Test']

在这里,它将对空白进行标记,然后将结果字符串与 'Test' 进行比较。

它是 XPath 3.1 函数 contains-token() 的替代方案

但目前 (2021-04-30) 没有浏览器支持 XPath 2.0 或更高版本。

答案 8 :(得分:-6)

你可以找到像这个例子的元素(所有的css元素)

private By 
allElementsCss = By.xpath(".//div[@class]");