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

时间:2015-03-29 15:09:05

标签: ruby nokogiri screen-scraping

我有一个部分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

3 个答案:

答案 0 :(得分:1)

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

categories = []

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

categories.uniq!
p categories

第一部分寻找所有&#34; li&#34;元素,然后在里面,我们寻找父(ul,ol),前面的元素(preceding-sibling)是一个h2。可以有多个,所以我们采取最后一个(即最接近当前位置的那个)。

我们需要打电话给&#34; uniq!&#34;因为我们得到每个&#39; li&#39; (因为&#39; li&#39;是起点)。

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

["Destinations", "Shopping List"]

答案 1 :(得分:1)

你很亲密。

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

答案 2 :(得分:-2)

代码:

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

结果:

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