2010-12-03 73 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