Разбор HTML с рельсами и нокогири - PullRequest
2 голосов
/ 13 сентября 2011

Мне нужно разобрать 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>

Как мне сформировать вопрос в цикле Я пробовал так много раз, но все еще получаю ошибку или плохие результаты ... ...

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 ]

5 голосов
/ 13 сентября 2011

Во-первых, обратите внимание, что размещенный вами 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 голос
/ 13 сентября 2011

Во-первых, ваши апострофы / цитаты отключены.Они должны быть ...

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