Удалить все узлы после указанного узла - PullRequest
6 голосов
/ 29 сентября 2011

Я извлекаю 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

Ответы [ 2 ]

4 голосов
/ 30 сентября 2011
  1. Найдите нужный вам div.
  2. Найдите нужный вам элемент «стоп», а затем найдите всех следующих братьев и сестер.
  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 голосов
/ 30 сентября 2011

Кажется, мне нужно было выбрать то, что мне нужно; не удаляя вещи - посмотрите отличное решение здесь: Nokogiri: выбор содержимого между элементами A и B

...