Detectar el charset en araña web

Hola!

Estoy haciendo una arañita web con open-uri, a la que le das una URL y
te devuelve el título, meta keywords y meta description de la web. Muy
sencillita y funciona bien, pero a veces tiene problemas la pobre con
la codificación de caracteres, ya que unas webs están en utf8, otras
en iso-8859-1, etc…

Con iconv puedo convertir de una codificación a otra, pero ¿se puede
detectar automáticamente la codificación de las webs de origen? ¿O la
única manera es buscar una línea en el HTML en plan…

y fiarse de que hayan puesto la codificación correcta?

¿Sería mejor si usara otra cosa en lugar de open-uri, algo que
resuelva este problema por sí solo?

On 22/05/07, Jaime I. [email protected] wrote:

Hola!

Con iconv puedo convertir de una codificación a otra, pero ¿se puede
detectar automáticamente la codificación de las webs de origen? ¿O la
única manera es buscar una línea en el HTML en plan…

y fiarse de que hayan puesto la codificación correcta?

La forma correcta es detectar el parametro charset del header
Content-type y, como seguridad, comprobar también el valor del
atributo charset en el elemento meta correspondiente.

Si los dos difieren, el agente de usuario debe dar prioridad al primero.

Más info


Manuel, que
piensa que eres una excelente persona y medra en torno a
http://simplelogica.net y/o simplelogica.net
Recuerda comer mucha fruta y verdura.

El 22/05/07, Manuel González Noriega
[email protected]
escribió:> La forma correcta es detectar el parametro charset del header

Content-type y, como seguridad, comprobar también el valor del
atributo charset en el elemento meta correspondiente.

Gracias Manuel, tenía que haber mirado mejor la documentación de
open-uri, que tiene un método “charset” para esto :slight_smile:

Hola Jaime,

Con iconv puedo convertir de una codificación a otra, pero ¿se puede
detectar automáticamente la codificación de las webs de origen? ¿O la
única manera es buscar una línea en el HTML en plan…

en openuri, en el bloque del open con la variable de control puedes
directamente preguntar por charset y te lo devuelve si está definido.
Por defecto si no está te devuelve iso-8859-1 que es lo que dice el rfc
por defecto a no ser que digas otra cosa en la cabecera.

Eso no significa que la página luego realmente esté codificada en el
charset que te dicen, pero en ese caso la página está mal hecha y poco
puedes hacer. Siempre puedes tirar del charset que te diga openuri para
hacer el conv y si te da una excepción dejarlo sin convertir.

También me suena que había una librería que a partir de una cadena
cualquiera trataba de adivinar el enconding, pero no recuerdo el nombre
y tampoco era fiable al 100%.

saludos,

javier ramírez

El 22/05/07, Xavier N. [email protected]
escribió:> En HTTP quien decide el charset sobre el papel es la cabecera Content-

Type, pero a la practica no siempre viene bien. La cosa seria:

  1. Ver si viene charset en la cabecera Content-Type.

  2. Si no, buscarlo en tag META con un parser o una expresion
    regular[*].

  3. Si no, pasarle la pagina a la libreria charguess.

O sea, que paciencia con el tema charset… :slight_smile: A ver si en los
próximos días lo afino a mi arañita experimental:

http://boris.railes.net

On May 22, 2007, at 11:28 AM, Jaime I. wrote:

y fiarse de que hayan puesto la codificación correcta?

¿Sería mejor si usara otra cosa en lugar de open-uri, algo que
resuelva este problema por sí solo?

En HTTP quien decide el charset sobre el papel es la cabecera Content-
Type, pero a la practica no siempre viene bien. La cosa seria:

  1. Ver si viene charset en la cabecera Content-Type.

  2. Si no, buscarlo en tag META con un parser o una expresion
    regular[*].

  3. Si no, pasarle la pagina a la libreria charguess.

– fxn

[*] Aqui una expresion regular puede ser fragil, los atributos pueden
venir en distinto orden, llevar o no comillas, simples o dobles, …