2011-07-06 9 views
8
>>> from lxml.etree import HTML, tostring 
>>> tostring(HTML('<fb:like>')) 
'<html><body><like/></body></html>' 

Observe cómo la etiqueta cambia de <fb:like> a simplemente <like>.¿Cómo preservar la información del espacio de nombres al analizar HTML con lxml?

Esto hace que procesar páginas que incorporan XFBML con lxml sea mucho más difícil. (Lo mismo sucede con <g:plusone></g:plusone>)

Cualquier ayuda es apreciada.

+2

HTML no tiene espacios de nombres. Bienvenido a las consecuencias de expandir elementos. Si es XHTML + FBML (en lugar de HTML + FBML), entonces podría usar un analizador XML. – Quentin

+0

Lo habría hecho, si fuera XML. El punto de los analizadores de HTML resilientes es que hacen el trabajo. Aunque tampoco me gustan estos nombres de etiquetas mágicas, creo que es razonable esperar de lxml para conservarlos. Trataré de hablar con los mantenedores para ver si esto puede ser acomodado. –

Respuesta

1

Intente agregar las definiciones de prefijo del espacio de nombres que faltan. lxml será avoid the namespaces otherwise, supuestamente para que sea más fácil para usted.

Es muy probable que los sitios que intenta analizar no contengan estas definiciones de espacio de nombres, por lo que debe agregarlos.

Algo como esto: xmlns:adlcp="http://xxx/yy/zzz"

+1

Desafortunadamente no funciona: http://pastebin.com/6zX3GSH2 –

1

Una forma de solucionar este problema es a patch libxml2.

Remitiéndose al código fuente de libxml2.9.2 (https: //git.gnome.org/browse/libxml2/tree/?id=v2.9.2), en SAX2.c (https: //git.gnome .org/browse/libxml2/tree/SAX2.c? id = v2.9.2) (el analizador interno de SAX utilizado para crear el árbol DOM) en la línea 1699 los atributos con xmlns no se analizan cuando están en modo HTML, y se analizan como cualquier otro atributo en la línea y 1740. En consecuencia, tiene sentido ajustar la línea 1622, que divide el nombre en prefijo y parte local. Cambio:

name = xmlSplitQName(ctxt, fullname, &prefix); 

en

if (!ctxt->html) { 
    name = xmlSplitQName(ctxt, fullname, &prefix); 
} else { 
    name = xmlStrdup(fullname); 
    prefix = NULL; 
} 

Entonces libxml2 consideraremos etiquetas como <o:p> a ser para los elementos con nombre o:p, es decir, el colon está incluido en el nombre del elemento con ningún significado especial. Esta es la interpretación correcta en HTML. Por ejemplo, the HTML5 specification says:

En la sintaxis HTML, los prefijos de espacio de nombres y declaraciones de espacios no tienen el mismo efecto que en XML. Por ejemplo, los dos puntos no tienen un significado especial en los nombres de los elementos HTML.

Esperemos que este cambio sea aprobado para una versión futura de libxml2. Hay un informe de error abierto (https: //bugzilla.gnome.org/show_bug.cgi?id=654146).

+0

Si bien este enlace puede responder la pregunta, es mejor incluir las partes esenciales de la respuesta aquí y proporcionar el enlace de referencia. Las respuestas de solo enlace pueden dejar de ser válidas si la página vinculada cambia. – Marcus

+0

@Marcus OK, hemos agregado detalles aquí. Perdón por los enlaces feos. No tengo suficiente reputación para incluirlos como enlaces reales. – Insightfuls

Cuestiones relacionadas