2011-09-13 128 views
2

我需要使用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

回答

5

首先,請注意,您發佈的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 
1

一件事,你的撇號/報價均爲關閉。他們應該是...

doc.xpath('//div[@id="mama"]/?or what?')