2011-10-24 27 views
8

Ho un codice che utilizza Nokogiri e sto cercando di ottenere il inner_html senza ottenere i commenti.Rimuovi commenti da inner_html

html = Nokogiri::HTML(open(@sql_scripts_url[1])) #using first value of the array 
html.css('td[class="ms-formbody"]').each do |node| 
    puts node.inner_html # prints comments 
end 
+2

Fornisci un frammento di codice HTML di esempio e la stringa risultante che desideri dopo averlo massaggiato. – Phrogz

+0

ho solo bisogno di rimuovere i commenti HTML come "" dal mio html. Ho usato strisce e ha funzionato. Non so se questo è il modo giusto però. – Maverick

risposta

12

Dal momento che non hanno fornito alcun esempio HTML o di output desiderato, ecco una soluzione generale:

È possibile selezionare i commenti SGML in XPath utilizzando il test comment() nodo; puoi toglierli dal documento chiamando lo .remove su tutti i nodi di commento. Illustrato:

require 'nokogiri' 
doc = Nokogiri.XML('<r><b>hello</b> <!-- foo --> world</r>') 
p doc.inner_html      #=> "<b>hello</b> <!-- foo --> world" 
doc.xpath('//comment()').remove 
p doc.inner_html      #=> "<b>hello</b> world" 

Si noti che quanto sopra modifica il documento in modo distruttivo per rimuovere i commenti. Se si desidera mantenere il documento originale non modificato, si potrebbe in alternativa fare questo:

class Nokogiri::XML::Node 
    def inner_html_reject(xpath='.//comment()') 
    dup.tap{ |shadow| shadow.xpath(xpath).remove }.inner_html 
    end 
end 

doc = Nokogiri.XML('<r><b>hello</b> <!-- foo --> world</r>') 
p doc.inner_html_reject #=> "<r><b>hello</b> world</r>" 
p doc.inner_html  #=> "<r><b>hello</b> <!-- foo --> world</r>" 

Infine, ricordiamo che, se non è necessario il markup, solo chiedendo per il text sé non include commenti HTML:

p doc.text    #=> "hello world" 
+0

Proverò a utilizzare il primo approccio per analizzare effettivamente i file .net config e sostituire i valori con specifici valori dell'ambiente di distribuzione e distribuire tali file. – Maverick

+4

Ancora più corto è 'doc.xpath ('// comment()'). Remove' che rimuove tutti i commenti in una volta. Non c'è bisogno di enumerare su di loro. – akuhn

+1

@akuhn Fantastico! Non avevo mai visto in precedenza ['Nokogiri :: XML :: NodeSet # remove'] (http://nokogiri.org/Nokogiri/XML/NodeSet.html#method-i-remove). Grazie. Ho aggiornato la mia risposta di conseguenza (e dovrò andare ad aggiornare altre risposte sul sito;). – Phrogz