2010-08-10 10 views
12

tengo un código HTML, que debe ser transformado, reemplazando algunas etiquetas por otras.Busque y reemplace nodos completos de HTML con Nokogiri

No sé acerca de estas etiquetas, porque vendrán de db. Por lo tanto, los métodos set_attribute o name de Nokogiri no son adecuados para mí.

tengo que hacerlo, de alguna manera, como en este pseudo-código:

def preprocess_content 
    doc = Nokogiri::HTML(self.content) 
    doc.css("div.to-replace").each do |div| 
    # "get_html_text" will obtain HTML from db. It can be anything, even another tags, tag groups etc. 
    div.replace self.get_html_text 
    end 
    self.content = doc.css("body").first.inner_html 
end 

He encontrado Nokogiri::XML::Node::replace método. Creo que es la dirección correcta.

Este método espera algún parámetro node_or_tags.

¿Qué método debo usar para crear un nuevo nodo del texto y reemplazar el actual con él?

Respuesta

22

Al igual que:

doc.css("div.to-replace").each do |div| 
    new_node = doc.create_element "span" 
    new_node.inner_html = self.get_html_text 
    div.replace new_node 
end 
+0

Se does't funciona para mí. I gen una errror: "sin análisis contextual en nodos no vinculados". Se queja de esta manera por la línea, donde la propiedad "inner_html" está configurada en – AntonAL

+1

que acabo de probar, y funciona en mi entorno. Intenta reemplazar 'new_node.inner_html =' con 'new_node.content =' y comprueba si hay errores, por favor. Debería. –

+0

Gracias, lo he descubierto. El problema era - modificar el elemento aún no vinculado al DOM. Primero debemos reemplazar y luego modificar. Es bueno, pero me enfrenté a un problema más confuso, no se puede insertar ningún marcado como reemplazo. Por ejemplo, cuando digo "new_node.inner_html ="

Test
"- funciona, pero cuando digo new_node.inner_html =" ", se bloquea con un mensaje" método indefinido 'niños 'for nil: NilClass "... – AntonAL

Cuestiones relacionadas