2011-11-13 25 views
26

Digamos que tengo una página con div. Puedo obtener fácilmente ese div con soup.find().BeautifulSoup innerhtml?

Ahora que tengo el resultado, me gustaría imprimir TODO innerhtml de ese : Quiero decir, necesitaría una cadena con TODAS las etiquetas html y texto todo junto, exactamente como la cadena que tendría ingrese en javascript con obj.innerHTML. es posible?

Respuesta

11

Una de las opciones podría ser el uso algo así:

innerhtml = "".join([str(x) for x in div_element.contents]) 
+1

Unicode (x) podría ser más seguro –

+1

Hay algunos otros problemas con esto. En primer lugar, no escapa a las entidades html (como mayor que y menor que) dentro de los elementos de cadena. En segundo lugar, escribirá el contenido de los comentarios, pero no las etiquetas de comentarios en sí. – ChrisD

+0

Agregando otra razón para no usar esto en los comentarios de @ChrisD: Esto arrojará un UnicodeDecodeError sobre el contenido que incluye caracteres no ASCII. – Anthon

29

Hay una función de indocumentado que hace aproximar la DOMs innerHTML method:

def innerHTML(element): 
    return element.decode_contents(formatter="html") 

Esto ha pasado todos mis casos de prueba hasta el momento. Tal vez alguien debería actualizar los documentos?

+4

Esto convertirá algunos caracteres en entidades HTML. Sin embargo, funciona bien con el formateador predeterminado ('Ninguno'). – Tgr

+1

Esta es la respuesta correcta. La respuesta de @peewhy no funciona por las razones descritas por ChrisD. – dbkaplun

+2

parece que esto ha sido renombrado a 'renderContents' con argumentos ligeramente diferentes' (codificación = DEFAULT_OUTPUT_ENCODING, prettyPrint = False, indentLevel = 0) ' – highvolt

1

¿Qué tal solo unicode(x)? Parece funcionar para mi.

Editar: Esto le dará el HTML externo y no el interno.

+0

Esto devolverá el div incluyendo el elemento externo, no solo el contenido. – Arany

+0

Tienes razón. Dejando esto aquí por ahora en caso de que esto ayude a alguien más. –

-1

Si sólo necesita el texto (no hay etiquetas HTML), entonces usted puede utilizar .text:

soup.select("div").text