删除指定节点后的所有节点

rit*_*lee 6 ruby nokogiri

我正在从网址抓取一段文本,并希望删除有一个backtotop类的段落下面的所有内容.我在stackoverflow上看到了一个遍历代码片段看起来很有希望,但我无法弄清楚如何将它合并到一起,所以@el只包含p.backtotopdiv中第一个的所有内容.

我的代码:

@doc = Nokogiri::HTML(open(url))
@el = @doc.css("div")[0]
end
Run Code Online (Sandbox Code Playgroud)

遍历代码段:

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
Run Code Online (Sandbox Code Playgroud)

Phr*_*ogz 4

  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>
Run Code Online (Sandbox Code Playgroud)
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>
Run Code Online (Sandbox Code Playgroud)

这是一个更复杂的示例,其中该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>
Run Code Online (Sandbox Code Playgroud)
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>
Run Code Online (Sandbox Code Playgroud)

如果您的 HTML 比上述更复杂,请提供实际示例以及您想要的结果。对于您以后提出的任何问题,这都是一个很好的建议。