2011-09-29 2 views
4

Я захватываю div текста из URL-адреса и хотел бы удалить все под абзацем, который имеет класс backtotop. Я видел фрагмент кода с траверсом здесь, в stackoverflow, который выглядит многообещающим, но я не могу понять, как его включить, поэтому @el содержит только до первого p.backtotop в div.Удалите все узлы после указанного узла

мой код:

@doc = Nokogiri::HTML(open(url)) 
@el = @doc.css("div")[0] 
end 

траверс сниппет:

doc = Nokogiri::HTML(code) 
stop_node = doc.css("p.backtotop") 
doc.traverse do |node| 
break if node == stop_node 
# else, do whatever, e.g. `puts node.name` 
end 

ответ

3
  1. Найти DIV вы хотите.
  2. Найдите нужный пункт «stop», а затем найдите всех следующих братьев и сестер.
  3. Удалите их.

Например:

<body> 
    <div id="a"> 
    <h2>My Section</h2> 
    <p class="backtotop">Back to Top</p> 
    <p>More Content</p> 
    <p>Even More Content</p> 
    </div> 
</body> 
require 'nokogiri' 
doc = Nokogiri::HTML(my_html) 
div = doc.at('#a') 
div.at('.backtotop').xpath('following-sibling::*').remove 
puts div 
#=> <div id="a"> 
#=>  <h2>My Section</h2> 
#=>  <p class="backtotop">Back to Top</p> 
#=>  
#=>  
#=> </div> 

Вот более сложный пример, где backtotop элемент не может быть в корне DIV:

<body> 
    <div id="b"> 
    <h2>Another Section</h2> 
    <section> 
     <p class="backtotop">Back to Top</p> 
     <p>More Content</p> 
    </section> 
    <p>Even More Content</p> 
    </div> 
</body> 
require 'nokogiri' 
doc = Nokogiri::HTML(my_html) 
div = doc.at('#b') 
n = div.at('.backtotop') 
until n==div 
    n.xpath('following-sibling::*').remove 
    n = n.parent 
end 

puts div 
#=> <div id="b"> 
#=>  <h2>Another Section</h2> 
#=>  <section><p class="backtotop">Back to Top</p> 
#=>  
#=>  </section> 
#=> </div> 

Если ваш HTML более сложный, чем выше, пожалуйста, укажите фактический образец вместе с тем вы хотите. Это хороший совет для любого будущего вопроса, который вы задаете.

+0

Как сжать результат? (удалите пустые строки) – ismail

+0

Это отличный ответ! благодаря – hernanvicente

Смежные вопросы