Re: Detección del encoding por el parser html de libxml2

Cesar Ortiz cesar.ortiz en gmail.com
Jue Feb 9 13:29:32 CET 2006


Indagando mas en el tema, he encontrado que en xml el encoding por defecto
es utf-8 mientras que en html es iso-8859-1 (para text/*).

Más info aquí: http://diveintomark.org/archives/2004/02/13/xml-media-types

Saludos, César

On 2/9/06, Cesar Ortiz <cesar.ortiz en gmail.com> wrote:
>
> Hola,
>
> En el ejemplo que te puse anteriormente (te pongo el fichero completo):
>
> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
> <!-- La siguiente forma de especifiar el encoding no sirve para libxml2
> -->
> <html>
> <head>
> <!-- META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=utf-8" -->
> <!-- META HTTP-EQUIV="Content-Type" CONTENT="text/html;
> charset=iso-8859-1" -->
> </head>
> <!-- comentario  1 -->
> <body>
> <!-- comentario 2 -->
> <!-- comentario 3 -->
> Hermano anterior. (Ejemplo de reduccion reducción de bloque con hermano)
> <br>
> <br>
> <p>Hermano posterior.</p>
> <img src="kk">
> <p> Un texto sin cerrar
> <p> Otro texto </p>
> Uno final
> </body>
> </html>
>
> El resto de contenido, como puedes ver, son caracteres válidos en utf-8.
> Según dice en la pagina que adjunté en el correo anterior (http://xmlsoft.org/encoding.html
> ):
>
> + usa un heuristico para detectar UTF-16 y UCS-4 (no es mi caso)
> + si hay declaración, la usa pero de todas formas funciona lo de la
> autodetección (bueno vete a saber como funciona con el parser de html....)
> + si no hay declaración de encoding y la entrada no es ni utf-8 ni utf-16
> se lanzará un error de encoding (no se produce ningún error en el ejemplo
> anterior)
>
> Con lo cual se supone que usa un encoding por defecto. No se de donde lo
> cogerá, pero desde luego que no es utf-8, ya que los caracteres ó tienen
> los valores 105 y 110 respectivamente.
>
> Si se descomenta la declaración para latin1, se obtiene el mismo
> resultado.
>
> Y un dato mas para acabar este correo:
>
> [fast en fast187 DW]$ python
> Python 2.3.5 (#1, Jun  8 2005, 15:34:20)
> [GCC 3.2.3 20030502 (Red Hat Linux 3.2.3-34)] on linux2
> Type "help", "copyright", "credits" or "license" for more information.
> >>> import locale
> >>> locale.getlocale()
> (None, None)
>
> Por cierto.... en el caso de parsear HTML, lo siguiente no vale:
>
> <?xml version="1.0" encoding="utf-8"?>
>
> Hay fichero que lo incluyen. Supongo que tendré que usar el parser de XML
> para parsear dichos ficheros (teóricamente XHTML).
>
>
>
> On 2/9/06, Chema Cortés <py en ch3m4.org> wrote:
> >
> > El Miércoles, 8 de Febrero de 2006 11:54, Cesar Ortiz escribió:
> >
> > > Estoy parseando documentos html usando el parser de html incluido en
> > > libxml2.
> > >
> > > Si el documento incluye el encoding todo va bien, pero si no lo
> > incluye,
> > > parece que no lo detecta. Sin embargo, en
> > > http://xmlsoft.org/encoding.html<http://www.google.com/url?sa=D&q=http://xm
> > >lsoft.org/encoding.html>se indica que debería detectarlo.
> >
> > Creo que lo has entendido mal.
> >
> > > Por ejemplo, si pongo una palabra en tiene caracteres en utf-8 en un
> > > documento donde el resto del texto son caracteres validos (tanto en
> > latin1
> > > como en utf-8), me hace lo siguiente: reducción --> reducción.
> >
> > No es correcto lo que dices. Una de dos, o son caracteres válidos para
> > latin1
> > o lo son para utf8. Ambas codificaciones no deben mezclarse en el mismo
> > documento. Se usan los mismos códigos para identificar las mismas letras
> > en
> > latin1 y en unicode; pero no es así entre latin1 y utf8. Los caracteres
> > de
> > latin1 con códigos mayores de 127 se representan con dos bytes en utf8.
> >
> > El formato interno del parser XML es utf8, y es la codificación por
> > defecto
> > que se espera en la entrada. En otro caso, se debe indicar
> > explícitamente la
> > codificación de alguna forma.
> >
> > > La forma de usar el parser es la siguiente (lo uso en modo SAX): creo
> > un
> > > contexto mediente htmlCreatePushParser() y despues uso
> > htmlParseChunk().
> > >
> > > ¿Es posible que la detección del encoding no funcione con
> > htmlParseChunk()?
> > > ¿O simplemente me estoy olvidando de algo?
> > >
> > > En caso de que esta sea la forma en que se comporta, me tocará a mí
> > > intengar hacer la detección y proporcionarsela al parser :(.
> >
> > Explica un poco mejor qué es lo que pretendes hacer. El parser sólo
> > entiende
> > utf8, y no tiene inteligencia para deducir en qué codificación le vienen
> > las
> > cosas. Puede utilizar un conversor de codificación que queda fijado en
> > los
> > primeros estadios, pero que no cambiará hasta que termine el stream por
> > mucho
> > que éste cambie luego de codificación.
> >
> > _______________________________________________
> > Python-es mailing list
> > Python-es en aditel.org
> > http://listas.aditel.org/listinfo/python-es
> >
>
>
>
> --
> Página personal: http://www.cesar.ortiz.name
> Weblog: http://_cesar_ortiz_.blogspot.com/




--
Página personal: http://www.cesar.ortiz.name
Weblog: http://_cesar_ortiz_.blogspot.com/




Más información sobre la lista de distribución Python-es