2010-08-10 9 views
0

Say, nous avons un HTML, dans lequel, tous les ...problèmes étranges avec Nokogiri

<div class="replace-me"> 
</div> 

... doit être remplacé par

<video src='my_video.mov'></video> 

Le code est le suivant:

doc.css("div.replace-me").each do |div| 
    div.replace "<video src='my_video.mov'></video>" 
end 

C'est simple, mais, malheureusement, ça ne marche pas pour moi. accidents Nokogiri avec erreur follwing:

undefined method children' for nil:NilClass /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/gems/1.8/gems/activesupport-2.3.5/lib/active_support/whiny_nil.rb:52:in method_missing' /Library/Ruby/Gems/1.8/gems/nokogiri-1.4.2/lib/nokogiri/html/document_fragment.rb:16:in initialize' /Library/Ruby/Gems/1.8/gems/nokogiri-1.4.2/lib/nokogiri/xml/node.rb:424:in new' /Library/Ruby/Gems/1.8/gems/nokogiri-1.4.2/lib/nokogiri/xml/node.rb:424:in fragment' /Library/Ruby/Gems/1.8/gems/nokogiri-1.4.2/lib/nokogiri/xml/node.rb:776:in coerce' /Library/Ruby/Gems/1.8/gems/nokogiri-1.4.2/lib/nokogiri/xml/node.rb:331:in `replace'

Remplacement avec div primitive ne fonctionne:

doc.css("div.replace-me").each do |div| 
    div.replace "<div>Test</div>" 
end 

Est-ce un bug Nokogiri, ou je fais quelque chose de mal?

PS: le même problème avec « add_child », « inner_html » et d'autres normalisateurs à cet effet

Répondre

0

Je vais citer mon commentaire de votre question précédente:

This happens because of HTML strictness (HTML has a predefined set of elements). Replace Nokogiri::HTML(self.content) with Nokogiri::XML(self.content) and do not forget to add a DOCTYPE declaration manually later.

+0

OK. Passons à cet article :) Il semble fonctionner avec le remplacement. Mais un autre problème - quand j'essaie de sauvegarder la partie du document modifiée sur self.content, je n'ai que les parties qui ont remplacé les anciennes. Mais d'autres éléments, qui étaient quelque part autour, et n'ont pas été modifiés (en self.content) - sont partis ... – AntonAL

+0

Très étrange. J'essaie de comprendre pourquoi. Pourriez-vous montrer votre source HTML avant tout remplacement? –

0

Si vous regardez dans le journal , la partie que vous avez choisie avec nokogiri tourne à zéro.

Voulez-vous essayer de cette façon?

doc.css(".replace-me").each do |div| 
div.replace "<video src='my_video.mov'></video>" 
end 

Vous devrez peut-être spécifier l'élément que vous souhaitez remplacer.

Questions connexes