Ruby on rails 使用rails和nokogiri解析html

Ruby on rails 使用rails和nokogiri解析html,ruby-on-rails,ruby,nokogiri,Ruby On Rails,Ruby,Nokogiri,我需要使用Rails和Nokogiri解析HTML。以下是HTML: 文本 文本2 文本 文本2 文本 文本2 我应该如何形成循环问题?我已经试了很多次了,但仍然得到一个错误或糟糕的结果。。。 结果应该是这样的 第一行的文本 第一妈妈发短信2 第一妈妈发来的短信 第二个妈妈发来的短信 等等 首先,您的撇号/引号已关闭。他们应该是 doc.xpath('//div[@id="mama"]/?or what?') 首先,请注意,您发布的HTML在语法上是无效的:拥有多个具有相同id属性值的元

我需要使用Rails和Nokogiri解析HTML。以下是HTML:


文本
文本2
文本
文本2
文本
文本2
我应该如何形成循环问题?我已经试了很多次了,但仍然得到一个错误或糟糕的结果。。。

结果应该是这样的

第一行的文本
第一妈妈发短信2
第一妈妈发来的短信
第二个妈妈发来的短信
等等

首先,您的撇号/引号已关闭。他们应该是

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

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

首先,您不需要多次使用id。如果要这样做,请使用类。
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