2010-12-03 8 views
3

Ich habe ein seltsames Problem mit Nokogiri in Rails. Ich versuche, ein "p" -Tag mit einer Klasse von "warum" zu entfernen. Ich habe den folgenden Code, der nicht funktioniert:Knoten in Nokogiri kann nicht entfernt werden

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> 

Output html Quelle:

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

ich die Schienen Code kennen geht in die if-Schleife, weil die logger.info auf dem Server-Terminal angezeigt wird.

Irgendwelche Ideen?

+1

Eine versteckte Verweisung auf _why? : D: D –

Antwort

5

Gibt es einen Grund, warum Sie Ihre @doc Instanzvariable erneut verwenden?

Wenn es darum geht, solche Dinge zu beheben, ist die beste Idee, den gleichen Code ohne den Rails-Overhead zu testen. Zum Beispiel:

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> 

Welche zurück:

<!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> 

Jetzt tun paragraphs = @doc.css("p") versuchen und dann paragraphs.each .. oder weglassen einfach die ganze Zuordnung wie ich oben haben.

+0

Um ehrlich zu sein, nicht sicher, warum ich das @ doc = darauf verwendet habe. Egal, es funktioniert, wenn ich die Aufgabe erledige und nur den doc.css.each-Code mache. Ich versuche herauszufinden, warum es so funktioniert, aber nicht mit der Zuweisung - weil die Zuweisung ein anderes Objekt erzeugt und das Objekt, das ich bearbeitet habe, um den Knoten zu entfernen, nicht das Objekt ist, das an das Objekt zurückgegeben wird Aussicht? –

Verwandte Themen