如何获取具有多个 css 类的 html 元素

Posted

技术标签:

【中文标题】如何获取具有多个 css 类的 html 元素【英文标题】:How to get html elements with multiple css classes 【发布时间】:2011-04-22 07:35:32 【问题描述】:

我知道如何获取相同 css 类的 DIV 列表,例如

<div class="class1">1</div>
<div class="class1">2</div>

使用 xpath //div[@class='class1']

但是如果一个 div 有多个类,例如

<div class="class1 class2">1</div>

xpath 会是什么样子?

【问题讨论】:

也许使用 CSS 路径会更好 【参考方案1】:

您要查找的表达式是:

//div[contains(@class, 'class1') and contains(@class, 'class2')]

我强烈推荐 XPath 可视化工具,它可以帮助您轻松调试 xpath 表达式。可以在这里找到:

http://xpathvisualizer.codeplex.com/

【讨论】:

此解决方案的小问题是,如果可能的类名是另一个类名的子字符串,它可能会中断。例如,如果您还有“class11”,它会错误地匹配它,因为它包含“class1”。不过,这很容易避免,只要确保类名不包含彼此即可。 同意,但考虑到这里讨论的内容涉及扫描属性的字符串值,在 XPath 中,我不确定是否可以避免。 好吧,如果真的有必要,你可以做contains(concat(' ', @class, ' '), ' class1 ') 等,但正如我所说,很容易避免这样做。 这是为我做的!我花了很长时间才解决这个问题!【参考方案2】:

根据this answer,这解释了为什么确保不包含正在查找的类名的子字符串很重要,正确答案应该是:

//div[contains(concat(' ', normalize-space(@class), ' '), ' class1 ')
    and contains(concat(' ', normalize-space(@class), ' '), ' class2 ')]

【讨论】:

【参考方案3】:

有一个有用的 python 包叫做 cssselect。

从 cssselect 导入 CSSSelector CSSSelector('div.gallery').path

生成一个可用的 XPath:

descendant-or-self::div[@class and contains(concat(' ', normalize-space(@class), ' '), ' gallery ')]

这与 Flynn1179 的回答非常相似。

【讨论】:

【参考方案4】:

我认为这是您正在寻找的表达方式

//div[starts-with(@class, "class1")]/text()

【讨论】:

【参考方案5】:

你也可以这样做:

//div[contains-token(@class, 'class_one') and contains-token(@class, 'class_two')]

【讨论】:

以上是关于如何获取具有多个 css 类的 html 元素的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript CSS 如何向一个元素添加和删除多个 CSS 类

使用 jQuery 获取不是具有特定 CSS 类的容器的子元素的元素的后代

Hibernate:如何从具有多个类的查询中获取结果

如何选择具有 2 个类的元素 [重复]

Scraperwiki + lxml。如何获取具有类的元素的子元素的 href 属性?

如何在所有站点上仅使用 css 获取具有相同数据属性的元素?