2011-09-29 111 views
4

我從網址中抓取文本的div,並且想要刪除具有backtotop類的段落下的所有內容。我在這裏看到了stackoverflow中的一段代碼,它看上去很有前途,但我無法弄清楚如何將它合併到一起,所以@el只包含了div中第一個p.backtotop的所有內容。刪除指定節點之後的所有節點

我的代碼:

@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. 找到你想要的股利。
  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項目可能不會在格根:

<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