2009-12-12 12 views
5

Estoy tratando de obtener una página con una codificación ISO-8859-1 clic en un enlace, por lo que el código es similar a esto:¿Cómo configurar la codificación de página mecanizada?

page_result = page.link_with(:text => 'link_text').click 

Hasta ahora me sale el resultado con una codificación incorrecta, por lo veo personajes como:

'T�tulo:' instead of 'Título:' 

que he probado varios enfoques, incluyendo:

  • la indicación de la codificación en la primera solicitud utilizando el agente como:

    @page_search = @agent.get(
        :url => 'http://www.server.com', 
        :headers => { 'Accept-Charset' => 'ISO-8859-1' }) 
    
  • Indicando la codificación para la propia página

    page_result.encoding = 'ISO-8859-1' 
    

Pero debo estar haciendo algo mal: un simple pone siempre muestran los caracteres incorrectos.

¿Sabes cómo indicar la codificación?

Gracias de antemano,

Agregado: ejemplo ejecutable:

require 'rubygems' 
require 'mechanize' 

WWW::Mechanize::Util::CODE_DIC[:SJIS] = "ISO-8859-1" 

@agent = WWW::Mechanize.new 

@page = @agent.get(
    :url => 'http://www.mcu.es/webISBN/tituloSimpleFilter.do?cache=init&layout=busquedaisbn&language=es', 
    :headers => { 'Accept-Charset' => 'utf-8' }) 

puts @page.body 

Respuesta

0

Sí, Mechanize intentará detectar la codificación en sí mismo (usando la biblioteca NKF núcleo de Ruby) que adivinar la codificación) y algunas veces falla .

Tal vez esto podría ayudar:
WWW::Mechanize::Util::CODE_DIC[:SJIS] = "ISO-8859-1"

No estoy muy seguro acerca de la sintaxis exacta, pero creo que la CODE_DICT Hash podría ser un buen lugar para buscar :)
tuve una similar problem un tiempo espalda.

+0

Por desgracia, no funciona ... – Juan

1

Lo siento, fue mi error: vengo de un fondo de Java y las cadenas se convierten internamente a utf-16. Olvidé que Ruby no lo hace. Mecanizar estaba recuperando la página sin problemas, pero necesitaba convertir los datos a través de iconv.

Nota mental: Ruby almacena las cadenas sin convertir su codificación.

+0

es posible que también quieren probar Ruby 1.9, si es posible, se añadió una porción entera de [material unicode] (http://blog.nuclearsquid.com/writings/ruby-1-9-encodings) –

10

Hey se puede simplemente hacer un:

agent.page.encoding = 'utf-8' 

espero que ayude!

+0

Es difícil usar 'agent.page.encoding' en código real, pero la idea es correcta y muy útil, ¡Gracias! –

+0

Pasé muchas horas tratando de solucionar este problema hasta que tropecé con su respuesta, ¡gracias! – CodeBiker

4

La respuesta anterior es correcta, pero en mi código que se ve un poco diferente:

agent = Mechanize.new 

page = agent.get('http://example.com') 

page.encoding = 'windows-1251' 

page.search('p').each do |para| 
    puts para.text 
end 
+0

Gracias! Este consejo solucionó un problema relacionado con la codificación de formulario que estaba en ASCII. –

Cuestiones relacionadas