我有一个部分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
答案 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"]