在我的网页中,有一个div,类名为Test。

如何用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="hello "></div>
//div[normalize-space(@class)="hello"]

使用XPath唯一正确的方法是:

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

这个函数将空格的前导和后导进行归一化,并将空格字符序列替换为单个空格。


Note

如果不需要很多这样的Xpath查询,您可能希望使用一个将CSS选择器转换为Xpath的库,因为CSS选择器通常比Xpath查询更容易读写。例如,在本例中,您可以使用选择器div.Test来获得完全相同的结果。

我找到了一些图书馆:

JavaScript: css2xpath & css-to-xpath 对于PHP: CssSelector组件 对于Python: cssselect 对于c#: css2xpath重新加载 GO: css2xpath

XPath有一个contains-token函数,专门针对这种情况设计的:

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

它只在XPath的最新版本(3.1)中得到支持,因此您需要一个最新的实现。

这个选择器应该工作,但如果你用适合的标记替换它会更有效:

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

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

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

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

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

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

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