2010-12-03 37 views
3

我在Rails中遇到了一些與Nokogiri有關的奇怪問題。我試圖刪除一個「爲什麼」類的「p」標籤。我有以下的代碼,它不工作:無法刪除Nokogiri中的節點

def test_grab 
    f = File.open("public/test.html") 
    @doc = Nokogiri::HTML.parse(f) 
    f.close 
    @doc = @doc.css("p") 
    @doc.each do |p| 
    if p["class"] == "why" 
     logger.info p.values 
     p.remove 
    end 
    end 
end 

的test.html:

<html> 
<head> 
    <title>Test</title> 
</head> 
<body> 
    <p>Test data</p> 
    <p>More <a href="http://stackoverflow.com">Test Data</a></p> 
    <p class="why">Why is this still here?</p> 
</body> 
</html> 

輸出HTML源代碼:

<p>Test data</p> 
<p>More <a href="http://stackoverflow.com">Test Data</a></p> 
<p class="why">Why is this still here?</p> 

我知道Rails代碼即將進入如果循環因爲logger.info出現在服務器終端上。

任何想法?

+1

_why的隱藏參考? :D:D – 2010-12-03 10:24:35

回答

5

是否有任何理由重複使用@doc實例變量?

當涉及到這樣的疑難解答時,我發現最好的想法是嘗試評估相同的代碼,而不會導致Rails開銷。例如:

require 'nokogiri' 

doc = Nokogiri::HTML(DATA) 
doc.css("p").each do |p| 
    p.remove if p["class"] == "why" 
end 

__END__ 
<html> 
<head> 
    <title>Test</title> 
</head> 
<body> 
    <p>Test data</p> 
    <p>More <a href="http://stackoverflow.com">Test Data</a></p> 
    <p class="why">Why is this still here?</p> 
</body> 
</html> 

將返回:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd"> 
<html> 
<head><title>Test</title></head> 
<body> 
    <p>Test data</p> 
    <p>More <a href="http://stackoverflow.com">Test Data</a></p> 

</body> 
</html> 

現在試圖做paragraphs = @doc.css("p")然後paragraphs.each ..或只是忽略了整個分配像我有以上。

+0

說實話,不知道爲什麼我在使用@ doc =就可以了。無論如何,當我拿出作業並執行doc.css.each代碼時,它就可以工作。我試圖讓我的頭爲什麼它會這樣工作,但不是與賦值 - 這是因爲賦值創建另一個對象,我操作的對象刪除節點不是返回到視圖? – 2010-12-03 13:07:40