用rails解析html和nokogiri

问题描述:

我需要使用Rails和Nokogiri解析HTML。这里是HTML:用rails解析html和nokogiri

<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... 
+2

首先,你不要多次使用id的。如果你打算这样做,请使用类。 – corroded

首先,请注意,您发布的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?')