在 Nokogiri 节点集中按 class 搜索

Search by class in Nokogiri nodeset

我从 Nokogiri 节点获得了 CSS class 的名称。现在我想找到所有也具有相同 class 附加的节点。

我不知道我要查找的元素有哪个 HTML 标记,也不知道它有多深。我只知道 class 要搜索什么。

我已经试过了:

doc.xpath("//*[contains(@class, #{css})]")

但这似乎 return 元素太多了。

我也试过了:

doc.xpath("//*[@class, #{css}]")

这个return没什么。

我想获取包含 class 的元素,而不是包含 class 的元素的每个元素。

Nokogiri 可以做到这一点吗?

正如我在评论中所说,.css().search() 可以找到给定 class 的所有元素。

这是我不久前写的一个爬虫的例子。它找到页面上唯一的 .content div(at() 将 select 只有第一个元素),然后找到所有 .col div在里面。然后循环遍历它们并打印标题。

content = page.at('.content')
content.css('.col').each do |col|
    puts col.at('h5').text
end

假设class名字存入class_name,我认为

doc.xpath("//*[contains(concat(' ', normalize-space(@class), ' '), ' #{class_name} ')]")

就是您要找的。

这会将所有包含 class_name 的元素匹配到它们的 classes 中,即如果 class_name 是 'box',那么它将匹配两个元素,如 div class="box"div class="box left"

等元素

如果您只想匹配像 div class="box" 这样的元素,即只有一个 class 并且 class 是您要查找的元素,那么您可以使用这个:

doc.xpath("//*[@class=\"#{class_name}\"]")