Во-первых, обратите внимание, что размещенный вами 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