使用 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
我有部分 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