Двойная петля Nokogiri Xpath

То, что я пытаюсь сделать, это извлечь блок кода, содержащий td, с классом по умолчанию. Это прекрасно работает. Но тогда мне нужно разобраться в разных частях блока кода. Когда я пытаюсь сделать это со вторым вызовом xpath, он каждый раз печатает все заголовки в каждом из блоков.

   def HeaderProcessor(doc)         
        doc.xpath("//td[@class='default']").each do |block|             
            puts block.xpath("//span[@class='comhead']").text
        end
    end

Когда я просто распечатываю блок, каждый блок распечатывается один раз и содержит заголовок комментария и сам комментарий. Когда я пытаюсь запустить xpath, он выводит КАЖДЫЙ заголовок, найденный в документе, и, похоже, игнорирует переменную блока.

Любые идеи о том, как я могу сделать эту работу? Что я не понимаю в xpath?

ОБНОВИТЬ:

<td class="default">
<div style="margin-top:2px; margin-bottom:-10px; ">
<span class="comhead">
#some data        
</span></div>
<br><span class="comment"><font color="#000000">#some more data</span>
</td>

person Noah Clark    schedule 21.09.2011    source источник


Ответы (1)


Вы говорите Нокогири искать в корне, когда говорите //span[@class='comhead'], вам просто нужно */span[@class='comhead']:

doc.xpath("//td[@class='default']").each do |block|
    block.xpath("*/span[@class='comhead']").each do |span|
        puts span.text
    end
end

или даже просто это:

doc.xpath('//td[@class="default"]/*/span[@class="comhead"]').each do |span|
    puts span.text
end

если вам не нужно ничего делать с элементами <td>.

person mu is too short    schedule 21.09.2011
comment
Несколько вещей мне непонятны: 1. Если я использую блочную переменную, почему она может получить доступ ко всем другим интервалам в других блоках. В основном я использую блок в качестве нового документа. 2. Когда я пробую ваш первый пример, он дает мне кучу пустых строк, и больше ничего. Когда я пробую ваш второй пример, он ничего не выводит. Я добавил упрощенную версию фактического HTML к своему исходному вопросу. Я надеюсь, что это полезно. - person Noah Clark; 21.09.2011
comment
@NoahClark: первый и второй примеры не работали, потому что у вас были дополнительные элементы внутри вашего <td>, о которых я не знал, я обновил его, чтобы учесть новую структуру. Ваш block все еще подключен к doc, поэтому он знает, где находится корень, поэтому //... снова начинается с doc; это может быть или не быть правильным, но это то, что он делает. - person mu is too short; 22.09.2011
comment
Хорошо, это имеет смысл. Большое спасибо! - person Noah Clark; 22.09.2011