Nokogiri Xpath Двойной цикл - PullRequest
       16

Nokogiri Xpath Двойной цикл

1 голос
/ 21 сентября 2011

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

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

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

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

UPDATE:

<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>

1 Ответ

2 голосов
/ 21 сентября 2011

Вы говорите Nokogiri искать от корня, когда вы говорите //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>.

...