在 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}\"]")
我从 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}\"]")