如何使用Nokogiri遍历HTML文档,搜索并跳到下一个项目?

时间:2013-12-24 21:19:45

标签: ruby nokogiri

如何遍历某个找到的元素然后继续下一个找到的项目?在我的例子中,我试图搜索第一个元素,抓取文本,然后继续,直到我找到下一个标签或直到我点击特定标签。我还需要考虑标签的原因是因为我想在那里做点什么。

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

谢谢!

2 个答案:

答案 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