Ruby开关,仅显示第一个和最后一个
我正在用nokogiri抓取一个网页,如下所示: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
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