2011-09-13 19 views
2

RailsとNokogiriを使ってHTMLを解析する必要があります。ここにHTMLがあります:railsとnokogiriで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> 

どのように私はループの質問を形成する必要がありますか?私は結果があなたのアポストロフィ/二重引用符がオフになっている、一つには

text from first mama 
text2 from first mama 
text from first mama 

text from second mama 
and so on... 
+2

まず、idを複数回使用しないでください。あなたがそれをやろうとしたら、クラスを使用してください。 – corroded

答えて

5

まずする必要があります。 あなたがHTMLを管理している場合は、この問題を修正する必要があります。

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 

あなたは(鋸山はCSSのために舞台裏ように)直接XPathを使用したい場合は、あなたがこれを行うだろう:同じ(無効)HTMLは、しかし、鋸山はまだ何の問題がないことを利用し

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?').each do |node| 
    parse_file.puts text1 
    parse_file.puts text2 
    parse_file.puts text1 
    parse_file.puts \n 
end 

... ...何度も試してみましたが、それでもエラーや不正な結果を得るしました。同じ id属性値に複数の要素を持っていることは違法である:彼らはあなたが投稿HTMLの構文が無効であることに注意してください、...

doc.xpath('//div[@id="mama"]/?or what?') 
関連する問題