我需要使用Rails和Nokogiri解析HTML。下面是HTML:
<body>
<div id="mama">
<div class="test1">text</div>
<div class="test2">text2</div>
</div>
<div id="mama">
<div class="test1">text</div>
<div class="test2">text2</div>
</div>
<div id="mama">
<div class="test1">text</div>
<div class="test2">text2</div>
</div>
</body>
我应该如何形成循环问题?我已经尝试了很多次,但仍然得到一个错误或不好的结果……
doc.xpath('//div[@id='mama']/?or what?').each do |node|
parse_file.puts text1
parse_file.puts text2
parse_file.puts text1
parse_file.puts n
end
结果应该像
text from first mama
text2 from first mama
text from first mama
text from second mama
and so on...
首先,注意您发布的HTML在语法上是无效的:拥有多个具有相同id
属性值的元素是非法的。如果你可以控制你的HTML,你应该解决这个问题。
然而,使用相同的(无效的)HTML, Nokogiri仍然没有问题:
require 'nokogiri'
doc = Nokogiri::HTML(my_html)
doc.css('#mama').each_with_index do |div,i|
puts "#{div.at_css('.test1').text} from mama ##{i}"
puts "#{div.at_css('.test2').text} from mama ##{i}"
end
#=> text from mama #0
#=> text2 from mama #0
#=> text from mama #1
#=> text2 from mama #1
#=> text from mama #2
#=> text2 from mama #2
如果您想直接使用XPath(就像Nokogiri在幕后为CSS所做的那样),您可以这样做:
doc.xpath("//div[@id='mama']").each_with_index do |div,i|
puts "#{div.at_xpath("./*[@class='test1']").text} from mama ##{i}"
puts "#{div.at_xpath("./*[@class='test2']").text} from mama ##{i}"
end
首先,您的撇号/引号是关闭的。
doc.xpath('//div[@id="mama"]/?or what?')