Ruby开关,只显示第一个和最后一个

时间:2017-11-26 19:29:07

标签: ruby switch-statement nokogiri

我正在用nokogiri这样抓网页:

doc = Nokogiri::HTML(File.read(html))    
doc.each do |node|
  case node.name
  when 'h1'
    Puts node.text
  when 'h2'
    puts node.text
  when 'h3'
    puts node.text
  when 'h4'
    puts node.text
  when 'h5'
    puts node.text
  end
end

有很多h5的。我不想全部列出它们,而是将它们组合在一起,只显示它们各自h4下面的第一个和最后一个。

1 个答案:

答案 0 :(得分:0)

您可以定义一个标志来检测它是否是第一个fun read(b: Array<Byte>, off: Int = 0, len: Int = b.size) { ... } 条目。 如果是第一个,则打印文本。然后将文本存储在变量中以便稍后使用。

如果级别从h5重置,则必须写入最后一个节点文本。

最后,您必须编写最后一个节点文本。

这样的事情:

h5

如果只有一个,则此代码将重复h5文本。但是根据您的描述,您的数据并非如此。

免责声明:未经测试的代码,缺少测试html;)

如果用计数器替换布尔标志,那么你也可以用一个h5节点捕获边缘情况。

示例:

doc = Nokogiri::HTML(File.read(html))    
first_flag = true
last_h5 = nil
doc.each do |node|
  #there was a h5 and now we have new version
  if first_flag == false and  node.name != 'h5'
    puts last_h5    
    first_flag = true
  end
  case node.name
  when 'h1'
    puts node.text
  when 'h2'
    puts node.text
  when 'h3'
    puts node.text
  when 'h4'
    puts node.text
  when 'h5'
    puts node.text if first_flag 
    first_flag = false
    last_h5 = node.text 
  end    
end

  #Write the last entry
  if first_flag == false and last_h5
    puts last_h5 
  end