WWW::Mechanize devuelve carácteres "extraños"

Estoy intentando hacer “scraping” de una página web con WWW::Mechanize
pero éste me devuelve carácteres no reconocidos para las palabras
acentuadas, con ñ, etc…

La página a la que accedo con WWW:Mechanize tiene la siguiente
definición:

  • <meta http-equiv="Content-Type"

content=“text/html;charset=iso-8859-15” />

Repasando el código de WWW::Mechanize, veo que éste inicializa la
request con los siguientes valores:

  • request-header: accept-charset => ISO-8859-1,utf-8;q=0.7,*;q=0.7
  • request-header: accept-language => en-us,en;q0.5

¿Alguien se ha peleado con este problema?, ¿alguna pista de lo que tengo
que hacer para visualizar correctamente los carácteres acentuados?.

Gracias.

Ya probaste cambiando la codificación a
utf-8, también revisa que configuración de locales tienes en el servidor
o
maquina donde estas haciendo las pruebas

El día 21/02/08, Dani S. [email protected]
escribió:

Gracias.


Posted via http://www.ruby-forum.com/.


Ror-es mailing list
[email protected]
simplelogica.net

Mauricio Dulcce

+57 300 325 0335
Trasn 9c No. 130c-21
Bogotá, Colombia

Mauricio,

La codificación de la página a la que quiero hacer “scraping” no puedo
cambiarla porque no es mía :wink: y la codificación que usa WWW::Mechanize,
después de leer la documentación, no he encontrado como cambiarla.

La configuación de la máquina donde estoy desarrollando, entiendo que
está bien, porque otras páginas si que se me ven bien.

En la lista de correo de WWW:Mechanize
(http://rubyforge.org/pipermail/mechanize-users/2008-January/000249.html)
encontré que el autor del plugin sugiere hacer una subclase de
WWW:Mechanize e implementar el método set_headers.

class MyMech < WWW::Mechanize
def set_headers(uri, request, cur_page)
super
request.add_field(‘Foo’, ‘bar’)
end
end

agent = MyMech.new
page = …

Cuando llegue a casa probaré añadiendo esto a la Request:

request.add_field(‘Accept-Charset’ => ‘utf-8’)

Nada!!!

Lo probé y el problema persiste. Ya no se que mirar!!

I si cuando recibes la cadena haces un iconv de lo que te venga en
iso-8859 a utf8?

content = Iconv.iconv(“ISO-8859-1”, “UTF-8”, content)

Un saludo,

Francesc

On Feb 22, 2008, at 8:57 AM, Dani S. wrote:

Nada!!!

Lo probé y el problema persiste. Ya no se que mirar!!

Posted via http://www.ruby-forum.com/.


Ror-es mailing list
[email protected]
simplelogica.net


Not sent from my iPhone

Francesc E. wrote:

I si cuando recibes la cadena haces un iconv de lo que te venga en
iso-8859 a utf8?

content = Iconv.iconv(“ISO-8859-1”, “UTF-8”, content)

Un saludo,

Francesc

Eso lo he probado también y nada…

Modifiqué el fuente del plugin (ya se que está muy mal, pero estaba
desesperado y quería ver donde estaba el problema :wink: y en cuanto lee el
response_body le apliqué el Iconv tal y como tú indicas.

El resultado fué un error porque Iconv se encontraba carácteres que no
reconocía. Le añadí //IGNORE a la llamada a Iconv, y entonces ya no daba
error pero eliminaba los carácteres polémicos: carácter-> carcter,
polémico -> polmico.

De todas maneras, Francesc, muchas gracias por tu respuesta!!!

Se despide un ojeroso trasnochador gracias a WWW::Mechanize…

On Feb 21, 2008, at 9:48 , Dani S. wrote:

Estoy intentando hacer “scraping” de una página web con WWW::Mechanize
pero éste me devuelve carácteres no reconocidos para las palabras
acentuadas, con ñ, etc…

En que sentido son no reconocidos, como compruebas que te vienen
“mal”? Que cabeceras recibes del servidor?

– fxn

Xavier N. wrote:

On Feb 21, 2008, at 9:48 , Dani S. wrote:

Estoy intentando hacer “scraping” de una p�gina web con WWW::Mechanize
pero �ste me devuelve car�cteres no reconocidos para las palabras
acentuadas, con �, etc…

En que sentido son no reconocidos, como compruebas que te vienen
“mal”? Que cabeceras recibes del servidor?

– fxn

Si hago scraping con otra herramienta como Firewatir, los carácteres son
correctos.

No son reconocidos porque sustituye las letras acentuadas por el símbolo
�. Es decir, Raúl->Ra�l, camión->cami�n y así sucesivamente.
Lo compruebo de dos maneras, analizando la respuesta con el debugger de
NetBeans (ya te digo que si hago scraping con Firewatir ya en el
debugger se ve bien mientras que si lo hago con WWW::Mechanize ya se ven
mal) y después saco la respuesta en una vista de mi aplicación en UTF-8
y también se ven mal los carácteres.

Gracias por el resumen Francesc!!

Después de ver tu resumenm, veo que me explico fatal :slight_smile:

Intentando investigar eso me he pasado casi toda la noche…

Lo que está claro es que esto …

########################################
require ‘rubygems’
require ‘mechanize’

agent = WWW::Mechanize.new
page = agent.get(‘http://elpais.es’)
puts page.body
########################################

Devuelve mal los carácteres con acentos … “En tu M?vil”

Y que …

########################################
require ‘rubygems’
require ‘mechanize’
require ‘iconv’

agent = WWW::Mechanize.new
page = agent.get(‘http://elpais.es’)
content = Iconv.iconv(“ISO-8859-1”, “UTF-8”, page.body)
puts content
########################################

Devuelve un error …

########################################
mechani.rb:11:in `iconv’: “\315S.com: el peri\363”…
(Iconv::IllegalSequence)
########################################

Ale. a investigar :wink:

On Feb 22, 2008, at 9:17 AM, Dani S. wrote:

error pero eliminaba los carácteres polémicos: carácter-> carcter,
simplelogica.net

Not sent from my iPhone

Xavier N. wrote:

On Feb 22, 2008, at 9:44 , Dani S. wrote:

“mal”? Que cabeceras recibes del servidor?
Lo compruebo de dos maneras, analizando la respuesta con el debugger
de
NetBeans (ya te digo que si hago scraping con Firewatir ya en el
debugger se ve bien mientras que si lo hago con WWW::Mechanize ya se
ven
mal) y después saco la respuesta en una vista de mi aplicación en
UTF-8
y también se ven mal los carácteres.

Y las cabeceras en ambos casos?

– fxn

Yo ahora no las tengo aquí. Intentaré postearlas esta tarde cuando
llegue a casa si no ha salido la solución.

On Feb 22, 2008, at 9:44 , Dani S. wrote:

“mal”? Que cabeceras recibes del servidor?
Lo compruebo de dos maneras, analizando la respuesta con el debugger
de
NetBeans (ya te digo que si hago scraping con Firewatir ya en el
debugger se ve bien mientras que si lo hago con WWW::Mechanize ya se
ven
mal) y después saco la respuesta en una vista de mi aplicación en
UTF-8
y también se ven mal los carácteres.

Y las cabeceras en ambos casos?

– fxn

On Feb 22, 2008, at 9:54 , Dani S. wrote:

Yo ahora no las tengo aquí. Intentaré postearlas esta tarde cuando
llegue a casa si no ha salido la solución.

Lo que has de tener claro es que por lo general una libreria no echa
los caracteres ni mal ni bien, el body de un response HTTP es una tira
de bytes que deben ser interpretados de acuerdo a las cabeceras por
el cliente, en este caso tu programa (no la libreria, salvo que tenga
API para pedirle una normalizacion o algo asi). Si no hay charset
explicito el RFC dice que es ISO-8859-1.

Por tanto, tu recibes un body amorfo, y un charset que indica como
interpretarlo. Con ambas cosas tienes lo necesario para normalizar si
tu aplicacion lo necesita.

Por ejemplo, la web del pais se descarga bien, mechanize solo echa
bytes. Si enviar el output de mechanize a un fichero, lo abres con un
editor, y le dices al editor que interprete ISO-8859-1 de acuerdo a
las cabeceras:

fxn@feynman:~/tmp$ curl -i http://www.elpais.com
HTTP/1.1 200 OK
Content-Type: text/html; charset=iso-8859-1 <---- AQUI
Cache-Control: max-age=10
Server: Apache
Last-Modified: Fri, 22 Feb 2008 09:06:05 GMT
Date: Fri, 22 Feb 2008 09:06:18 GMT
Transfer-Encoding: chunked
Connection: keep-alive
Connection: Transfer-Encoding

lo veras bien. Al hacer pruebas de este tipo ni netbeans ni la consola
son buenos aliados (posiblemente tengas configurado netbeans para que
todos los paneles de texto interpreten UTF-8 y sea por eso que lo ves
mal). Lo mas claro es escribir a un fichero y abrir con un editor que
te permita cambiar el encoding facilmente como el Re-Open With
Encoding de TextMate.

– fxn

Ah, dos cosas mas que quiza puedan ser relevantes cuando te lo mires.

  • La respuesta de un servidor puede depender del cliente (esto es de
    las cabeceras que envia). Creo que es improbabale que sea importante
    aqui si por ejemplo recibes el mismo idioma en ambos casos.

  • FireWatir se comunica con Firefox por JavaScript, por ejemplo veras
    que en general el body de una pagina no coincide con el codigo fuente
    necesariamente, veras atributos reordenados etc. Podria pasar que
    JavaScript si que haga una normalizacion en sus cadenas y sea esto lo
    que se ve en Ruby. Ahi se mezclan un lenguaje de programacion con
    character encoding de cadenas normalizado (JavaScript, Java), con uno
    que no (Ruby). Eso podria explicar la diferencia.

– fxn

Yo solucione la papeleta de una manera poco ortodoxa:

agent.user_agent_alias = ‘Mac Safari’

Jugaba tan solo con Mechanize, nada serio…

Juan.

El día 22/02/08, Dani S. [email protected]
escribió:

Xavier N. wrote:

Ah, dos cosas mas que quiza puedan ser relevantes cuando te lo mires.

  • La respuesta de un servidor puede depender del cliente (esto es de
    las cabeceras que envia). Creo que es improbabale que sea importante
    aqui si por ejemplo recibes el mismo idioma en ambos casos.

  • FireWatir se comunica con Firefox por JavaScript, por ejemplo veras
    que en general el body de una pagina no coincide con el codigo fuente
    necesariamente, veras atributos reordenados etc. Podria pasar que
    JavaScript si que haga una normalizacion en sus cadenas y sea esto lo
    que se ve en Ruby. Ahi se mezclan un lenguaje de programacion con
    character encoding de cadenas normalizado (JavaScript, Java), con uno
    que no (Ruby). Eso podria explicar la diferencia.

– fxn

Xavier y Ferran, muchas gracias por la ayuda. Creo que ya tengo deberes
para el fin de semana…

On Feb 22, 2008, at 10:41 , Xavier N. wrote:

  • FireWatir se comunica con Firefox por JavaScript, por ejemplo
    veras que en general el body de una pagina no coincide con el codigo
    fuente necesariamente, veras atributos reordenados etc. Podria pasar
    que JavaScript si que haga una normalizacion en sus cadenas y sea
    esto lo que se ve en Ruby.

Nope, he estado haciendo screen-scrapping de paginas con distintos
charsets y he tenido que normalizar a mano con iconv.

Dani, avanzaste en esto por cierto?

– fxn

Xavier N. wrote:

On Feb 22, 2008, at 10:41 , Xavier N. wrote:

  • FireWatir se comunica con Firefox por JavaScript, por ejemplo
    veras que en general el body de una pagina no coincide con el codigo
    fuente necesariamente, veras atributos reordenados etc. Podria pasar
    que JavaScript si que haga una normalizacion en sus cadenas y sea
    esto lo que se ve en Ruby.

Nope, he estado haciendo screen-scrapping de paginas con distintos
charsets y he tenido que normalizar a mano con iconv.

Dani, avanzaste en esto por cierto?

– fxn

Xavier,

La verdad es que no. Me he liado más todavía y estoy un poco a medias
con todo. Te cuento:

  • A parte del problema de los carácteres extraños, tenía un problema de
    normalización del html ya que la página a la que accedía tenía html mal
    formado que no se solucionaba ni con RubySoup ni otros parsers que
    probé.

  • Anteriormente ya había probado Firewatir y me había ido muy bien. Así
    que al juntar los dos problemas, carácteres extraños y html mal formado
    (pero que firefox sí que entendía) decidí cambiar a Firewatir.

  • El problema del html mal formado, se solucionó por lo que tu
    explicaste en tu post de como trabaja firewatir. Mi sorpresa llegó en
    que Firewatir también me devuelvía carácteres extraños para esta página.

  • Así que la conclusión es que realmente tengo un problema con el
    charset de esta página y su response y no con la herramienta de
    scrapping.

Desgraciadamente, llevaba tantos días atascado con el tema y no avanzaba
que lo aparqué de momento para volver a él cuando tuviera más fuerzas.

Así que en breve, seguro que pongo alguna preguntita de Iconv. Espero
que me ayudes :wink:

Saludos

Xavier N. wrote:

On Feb 22, 2008, at 10:41 , Xavier N. wrote:

Dani, avanzaste en esto por cierto?

– fxn

Xavier,

Hoy he vuelto a ponerme con este tema. No te vas a creer la tontería que
era…

Siempre me pasa lo mismo, menos mal que ya me voy conociendo. Cuando me
atasco con algo durante horas y no veo el problema, lo mejor que puedo
hacer es dejarlo y retomarlo al cabo de un tiempo para verlo con nuevos
ojos.

Como decía Francesc en una entrada anterior, el problema que tenía al
aplicar Iconv a mi página con charset ISO-8859-1, como me habías
aconsejado, era

########################################
require ‘rubygems’
require ‘mechanize’
require ‘iconv’

agent = WWW::Mechanize.new
page = agent.get(‘http://elpais.es’)
content = Iconv.iconv(“ISO-8859-1”, “UTF-8”, page.body)
puts content
########################################

Devuelve un error …

########################################
mechani.rb:11:in `iconv’: “\315S.com: el peri\363”…
(Iconv::IllegalSequence)
########################################

Al volver a intentarlo hoy y leer la documentación de Icon.iconv, me he
dado cuenta que el método está definido como:

Iconv.iconv(to, from, *strs)

UUUUPPPPSSSSS!!!

Lo estaba haciendo al revés, la instrucción correcta era:

content = Iconv.iconv(“UTF-8”,“ISO-8859-1”, @page.body)

…Y Voila!!! Los carácteres “raros” han desaparecido!!!

Gracias a todos por vuestra ayuda y en especial a Xavier y Francesc.