用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...
答
首先,请注意,您发布的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?')
首先,你不要多次使用id的。如果你打算这样做,请使用类。 – corroded