如何遍历某个找到的元素然后继续下一个找到的项目?在我的例子中,我试图搜索第一个元素,抓取文本,然后继续,直到我找到下一个标签或直到我点击特定标签。我还需要考虑标签的原因是因为我想在那里做点什么。
HTML
<table border=0>
<tr>
<td width=180>
<font size=+1><b>apple</b></font>
</td>
<td>Description of an apple</td>
</tr>
<tr>
<td width=180>
<font size=+1><b>banana</b></font>
</td>
<td>Description of a banana</td>
</tr>
<tr>
<td><img vspace=4 hspace=0 src="common/dot_clear.gif"></td>
</tr>
...Then this repeats itself in a similar format
当前scrape.rb
#...
document.at_css("body").traverse do |node|
#if <font> is found
#puts text in font
#else if <img> is found then
#puts img src and continue loop until end of document
end
谢谢!
答案 0 :(得分:1)
有趣。您基本上想要遍历树中的所有子项,并根据获得的节点执行一些操作。
以下是我们如何做到这一点:
#Acquiring dummy page
page = Nokogiri::HTML(open('http://en.wikipedia.org/wiki/Ruby_%28programming_language%29'))
现在,如果您想要开始遍历所有body
元素,我们可以使用XPath
进行救援。 XPath表达式://body//*
将在body
中返回所有子项和 grand-children 。
这将返回类Nokogiri::XML::Element
page.xpath('//body//*')
page.xpath('//body//*').first.node_name
#=> "div"
因此,您现在可以遍历该阵列并执行操作:
page.xpath('//body//*').each do |node|
case node.name
when 'div' then #do this
when 'font' then #do that
end
end
答案 1 :(得分:0)
或许这样的事情:
document.at_css("body").traverse do |node|
if node.name == 'font'
puts node.content
elsif node.name == 'img'
puts node.attribute("src")
end