Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby开关,仅显示第一个和最后一个_Ruby_Switch Statement_Nokogiri - Fatal编程技术网

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

Ruby开关,仅显示第一个和最后一个,ruby,switch-statement,nokogiri,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 no

我正在用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下的第一个和最后一个。

您可以定义一个标志来检测它是否是第一个
h5
条目。 如果是第一个,则打印文本。然后将文本存储在一个变量中,以便以后使用

如果级别从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
如果只有一个,该代码将重复h5文本。但根据您的描述,您的数据并非如此

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


如果将布尔标志替换为计数器,则还可以使用一个h5节点捕捉边缘情况

例如:

h5_count = 0
last_h5 = nil
doc.each do |node|
  #there was a h5 and now we have new version
  if h5_count > 1 and  node.name != 'h5'
    puts last_h5    
    h5_count = 0
  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 h5_count == 0
    h5_count += 1
    last_h5 = node.text 
  end    
end

  #Write the last entry
  if h5_count > 1
    puts last_h5    
  end

html有什么想法,你真正想要什么?你可以用一个XPath表达式获取你想要的。我建议
当'h1',h2',h3',h4'
(后面跟着
放置node.text
)时。正如我在回答中所写的:如果只有一个,这段代码将重复h5文本。但从你的描述来看,你的数据并非如此这个问题显然没有这种优势。但你是对的。这需要额外的检查。(你可以用一个计数器来代替布尔标志)。@knutoops,我忽略了你答案的那一部分。但我不认为这个问题排除了这个可能性。事实上,OP已经临时将URL添加到问题中,如果我没有弄错的话,该页面上确实存在单h5节。@knut您添加的版本有缺陷,它在我的测试中遗漏了
2.1
:我想说
2.1
会因为这个
放置节点而遗漏。如果h5\u计数==0