2010-12-03 5 views
3

Je rencontre un problème étrange avec Nokogiri in Rails. J'essaie de supprimer un "p" tag avec une classe de "pourquoi". Je le code suivant, qui ne fonctionne pas:Impossible de supprimer le nœud dans 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> 

sortie source 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> 

Je sais que le code barres va dans le si boucle parce que le logger.info apparaît sur le terminal du serveur.

Des idées?

+1

Une référence cachée à _why? : D: D –

Répondre

5

Y a-t-il une raison pour laquelle vous réutilisez votre variable d'instance @doc?

En ce qui concerne le dépannage de ce genre, je trouve que la meilleure idée est d'essayer d'évaluer le même code sans le surcoût de Rails. Par exemple:

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> 

qui retourne:

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

maintenant essayer de faire paragraphs = @doc.css("p") puis paragraphs.each .. ou tout simplement omettre l'affectation tout comme je l'ai ci-dessus.

+0

Pour être honnête, je ne sais pas pourquoi j'utilisais le @ doc = sur cela. Quoi qu'il en soit, cela fonctionne quand je sors la tâche et que je fais juste le code doc.css.each. J'essaie de comprendre pourquoi cela fonctionnerait de cette manière mais pas avec l'affectation - est-ce parce que l'assignation crée un autre objet et l'objet sur lequel j'ai opéré pour retirer le nœud n'est pas celui qui est retourné au vue? –

Questions connexes