使用 Nokogiri 在另一个元素之前查找元素

Using Nokogiri to find element before another element

我有部分 HTML 文档:

<h2>Destinations</h2>
<div>It is nice <b>anywhere</b> but here.
<ul>
  <li>Florida</li>
  <li>New York</li>
</ul>
<h2>Shopping List</h2>
<ul>
  <li>Booze</li>
  <li>Bacon</li>
</ul>

在每个 <li> 项目上,我想知道该项目所属的类别,例如 <h2> 标签中的文本。

这段代码不起作用,但这是我想要做的:

@page.search('li').each do |li|
  li.previous('h2').text
end

Nokogiri 允许您使用 xpath 表达式来定位元素:

categories = []

doc.xpath("//li").each do |elem|
  categories << elem.parent.xpath("preceding-sibling::h2").last.text
end

categories.uniq!
p categories

第一部分查找所有 "li" 元素,然后在内部,我们查找父元素 (ul, ol),即 (preceding-sibling) 之前的一个元素,它是一个 h2。可以有多个,所以我们取最后一个(即离当前位置最近的那个)。

我们需要调用 "uniq!",因为我们得到每个 'li' 的 h2(因为 'li' 是起点)。

使用您自己的 HTML 示例,此代码输出:

["Destinations", "Shopping List"]

代码:

categories = []
Nokogiri::HTML("yours HTML here").css("h2").each do |category|
        categories << category.text
      end

结果:

categories = ["Destinations", "Shopping List"] 

你很接近。

@page.search('li').each do |li|
  category = li.xpath('../preceding-sibling::h2').text
  puts "#{li.text}: category #{category}" 
end