在Nokogiri节点集中按类进行搜索

时间:2015-06-16 02:21:49

标签: ruby xpath nokogiri

我从Nokogiri节点获得了CSS类的名称。现在我想找到所有连接相同类的节点。

我不知道我要查找的元素包含哪个HTML标记,以及它有多深。我所知道的就是要搜索的课程。

我已经尝试过了:

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

但这似乎回归了太多元素。

我也尝试过:

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

并且不返回任何内容。

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

Nokogiri可以这样做吗?

2 个答案:

答案 0 :(得分:2)

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

这是我刚才写的一个刮刀的例子。它找到页面上唯一的.content div(at()将仅选择第一个元素),然后查找其中的所有.col div。然后它循环遍历它们并打印标题。

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

答案 1 :(得分:1)

假设班级名称存储在class_name中,我认为

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

是您正在寻找的。

这会将包含class_name的所有元素与其类匹配,即如果class_name为“box”,则它将匹配div class="box"等元素和{{1}等元素}}

如果您只想匹配div class="box left"之类的元素,即只有一个类而且该类是您正在寻找的类,那么您可以使用它:

div class="box"