【问题标题】:How can I find an element by CSS class with XPath?如何使用 XPath 通过 CSS 类查找元素?
【发布时间】:2010-12-08 22:26:50
【问题描述】:

在我的网页中,有一个div 和一个名为classTest

如何使用XPath 找到它?

【问题讨论】:

标签: html css xml xpath


【解决方案1】:

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

//*[contains(@class, 'Test')]

或者,因为我们知道寻找的元素是div

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

但由于这也将匹配class="Testvalue"class="newTest" 之类的情况,因此 cmets 中提供的@Tomalak 版本更好

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

如果你真的想确定它会正确匹配,你还可以使用 normalize-space 函数来清除类名周围的杂散空白字符(如@Terry 所述):

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

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

【讨论】:

  • @meder:更像//div[contains(concat(' ', @class, ' '), ' Test ')] - 你的也会出现部分匹配。
  • 你为什么不直接做 //div[@class='Test']
  • 因为类可以包含多个值
  • 我很惊讶 xpath 没有快捷方式/更有效的方法来定位空格分隔的令牌列表中的令牌。更高版本的 xpath 中的任何内容?
  • @thomasrutter 为什么令人惊讶 - 这只是一种为 XML 制作的语言,而不是更具体的 HTML,谁说在 XML 中使用空格分隔的列表作为任何节点值是随意的。 Tomalak 的解决方案是一个非常可行的解决方案。
【解决方案2】:

最简单的方法..

//div[@class="Test"]

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

【讨论】:

  • 上面的语法更容易使用,也不容易出错。请记住,您需要在班级周围加上双引号才能进行搜索。我建议使用上面列出的。 //div[@class="Test"]
  • @Jake0x32,那是因为它使用// 而不仅仅是/
  • 是否也匹配`
  • @JugalThakkar 不,它没有。它需要完全匹配才能工作,但您可以尝试 //div[contains(@class,"Test")] 代替。
  • 这个答案可能会受益于进一步的澄清,因为它并没有真正回答 OP 的问题。 OP 说“带有名为 Test 的类的 div”,但在任何时候都没有建议“Test”是 div 中的 only 类,这是这个答案所假设的。这个答案的简单性很有吸引力,这可能会引诱读者陷入困境。
【解决方案3】:

唯一使用 XPath 的正确方法:

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

函数normalize-space 去除前导和尾随空格,并将空白字符序列替换为单个空格。


注意

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

我已经找到了一些库:

【讨论】:

  • 这确实是避免问题的唯一方法,例如如果你分配了不止一门课!
  • //div[@class[contains(.,'Test')]] 怎么样?
【解决方案4】:

我只是提供这个作为答案,就像 Tomalak 很久以前作为对 meder 答案的评论提供的那样

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

【讨论】:

  • 很抱歉从很久以前提出这个问题,但是 concat(' ', normalize-space(@class), ' ') 也考虑到各种空白字符呢?
  • 为了好奇 - 为什么//div[contains(concat(' ', @class, ' '), ' Test ')]/chid 不选择儿童?
  • @Fusion 如果您将其作为问题发布,您可能会得到答案。
  • @bitolean 成为 Cbvious 船长这几天很难
  • @Fusion 我只是想帮忙。 XPath 不是 HTML 感知语言。它更通用,仅限 XML。我没有任何经验,但我认为你假设你可以只放 id 而不是标签。您需要选择“id”属性的值。因此,您需要将 HTML 文档视为 XML。不过,跑题的讨论并不能帮助人们找到解决方案。
【解决方案5】:

XPath 有一个 contains-token 函数,specifically designed 用于这种情况:

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

它仅在最新版本的 XPath (3.1) 中受支持,因此您需要最新的实现。

【讨论】:

  • XPath 3.1,根据您的链接。
  • 是的,它是在 3.1 版中添加的。 W3C 有一个很好的3.0-3.1 diff。我已经更新了答案。
【解决方案6】:

匹配一个有空格的类。

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

【讨论】:

    【解决方案7】:

    从 XPath 2.0 开始,您可以使用一个标记化功能:

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

    这里它将对空白进行标记,然后将生成的字符串与“测试”进行比较。

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

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

    【讨论】:

      【解决方案8】:
      //div[@class[contains(.,'Test')]]
      

      这是我在当前项目中使用的,它运行流畅

      表达式中的点. 表示任何div 元素的class 属性的值。所以你不需要使用normalize-spaceconcat。请注意,这也可能会选择类名为 XXXTestXXX 的 div。我碰巧有我的可搜索类为infobox-header,而该页面没有像XXinfobox-headerXXXX 这样的东西。

      【讨论】:

        猜你喜欢
        相关资源
        最近更新 更多
        热门标签