2011-10-24 28 views
8

Tengo un código que utiliza Nokogiri y estoy tratando de obtener el inner_html sin obtener los comentarios.Eliminar los comentarios de 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

Proporcione un fragmento HTML de muestra y la cadena resultante que desea después de masajearlo. – Phrogz

+0

solo necesitaba los comentarios HTML eliminados como "" de mi html. Usé strip y funcionó. No sé si este es el camino correcto. – Maverick

Respuesta

12

Puesto que no se ha proporcionado ningún tipo de HTML muestra o salida deseada, aquí es una solución general:

Puede seleccionar los comentarios SGML en XPath mediante la prueba comment() nodo; puede quitarlos del documento llamando al .remove en todos los nodos de comentarios. Ilustrado:

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" 

Tenga en cuenta que lo anterior modifica el documento de forma destructiva para eliminar los comentarios. Si desea guardar el documento original sin modificar, se puede, alternativamente, hacer esto:

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

Por último, tenga en cuenta que si no es necesario el marcado, simplemente pidiendo la text en sí no incluye comentarios HTML:

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

Intentaré utilizar el primer enfoque para analizar realmente archivos .net config y reemplazar valores con valores específicos del entorno de despliegue y desplegar esos archivos. – Maverick

+4

Aún más corto es 'doc.xpath ('// comment()'). Remove' que elimina todos los comentarios a la vez. No es necesario enumerarlos. – akuhn

+1

@akuhn ¡Fantástico! No había visto previamente ['Nokogiri :: XML :: NodeSet # remove'] (http://nokogiri.org/Nokogiri/XML/NodeSet.html#method-i-remove). Gracias. He actualizado mi respuesta en consecuencia (y tendré que ir y actualizar otras respuestas en el sitio;). – Phrogz

Cuestiones relacionadas