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

Cesar Ortiz cesar.ortiz en gmail.com
Jue Feb 9 11:10:46 CET 2006


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/




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