2009-02-25 13 views
2

J'essaie de faire un peu de webscraping, mais la gemme WWW: Mechanize ne semble pas aimer l'encodage et les plantages.
La demande de publication aboutit à une redirection 302 (que la mécanisation suit, jusqu'ici tout va bien) et la page résultante semble la planter. J'ai un peu googlé, mais rien n'a été jusqu'à présent résolu. Quelqu'un d'entre vous a une idée?Iconv :: IllegalSequence lors de l'utilisation de www :: mechanize

code:

require 'rubygems' 
require 'mechanize' 

agent = WWW::Mechanize.new 

agent.user_agent_alias = 'Mac Safari' 
answer = agent.post('https://www.budget.de/de/reservierung/privatkunden/step1/schnellbuchung', 
{"Country" => "Deutschland", 
"Abholstation" => "Aalen", 
"Abgabestation" => "Aalen", 
"Abholdatum" => "26.02.2009", 
"Abholzeit_stunde" => "13", 
"Abholzeit_minute" => "30", 
"Abgabedatum" => "28.02.2009", 
"Abgabezeit_stunde" => "13", 
"Abgabezeit_minute" => "30", 
"CountryID" => "DE", 
"AbholstationID"=>"AA1", 
"AbgabestationID"=>"AA1" 
} 
) 
puts answer.body 

Erreur:

D:/Ruby/lib/ruby/gems/1.8/gems/mechanize-0.9.1/lib/www/mechanize/util.rb:29:in `iconv': "\204nderungen vorbe"... (Iconv::IllegalSequence) 
from D:/Ruby/lib/ruby/gems/1.8/gems/mechanize-0.9.1/lib/www/mechanize/util.rb:29:in `to_native_charset' 
from D:/Ruby/lib/ruby/gems/1.8/gems/mechanize-0.9.1/lib/www/mechanize/chain/response_header_handler.rb:29:in `handle' 
from D:/Ruby/lib/ruby/gems/1.8/gems/mechanize-0.9.1/lib/www/mechanize/chain.rb:30:in `pass' 
from D:/Ruby/lib/ruby/gems/1.8/gems/mechanize-0.9.1/lib/www/mechanize/chain/handler.rb:6:in `handle' 
from D:/Ruby/lib/ruby/gems/1.8/gems/mechanize-0.9.1/lib/www/mechanize/chain/response_body_parser.rb:35:in `handle' 
from D:/Ruby/lib/ruby/gems/1.8/gems/mechanize-0.9.1/lib/www/mechanize/chain.rb:30:in `pass' 
from D:/Ruby/lib/ruby/gems/1.8/gems/mechanize-0.9.1/lib/www/mechanize/chain/handler.rb:6:in `handle' 
from D:/Ruby/lib/ruby/gems/1.8/gems/mechanize-0.9.1/lib/www/mechanize/chain/pre_connect_hook.rb:14:in `handle' 
from D:/Ruby/lib/ruby/gems/1.8/gems/mechanize-0.9.1/lib/www/mechanize/chain.rb:25:in `handle' 
from D:/Ruby/lib/ruby/gems/1.8/gems/mechanize-0.9.1/lib/www/mechanize.rb:494:in `fetch_page' 
from D:/Ruby/lib/ruby/gems/1.8/gems/mechanize-0.9.1/lib/www/mechanize.rb:545:in `fetch_page' 
from D:/Ruby/lib/ruby/gems/1.8/gems/mechanize-0.9.1/lib/www/mechanize.rb:403:in `post_form' 
from D:/Ruby/lib/ruby/gems/1.8/gems/mechanize-0.9.1/lib/www/mechanize.rb:322:in `post' 
from test.rb:7 

Répondre

3

Cette page est certainement UTF-8, mais Mechanize utilise NKF (un noyau de bibliothèque Ruby) pour deviner l'encodage et pour une raison quelconque, il apparaît comme Shift JIS. Le moyen le plus rapide de contourner le problème est de remplacer le mappage de codage pour Mechanize, de sorte que lorsqu'il essaie de convertir le corps en UTF-8 en utilisant Iconv, il passe aussi le codage source en UTF-8. Vous pouvez le faire comme ceci:

WWW::Mechanize::Util::CODE_DIC[:SJIS] = "UTF-8" 

place que juste après la ligne où vous require la bibliothèque Mechanize. Vous voudrez peut-être redéfinir la valeur immédiatement après, ou mieux encore, trouver la cause première du problème et soumettre un correctif si nécessaire.

Remarque: La façon dont j'ai résolu ce problème consistait à déboguer la bibliothèque Mechanize en utilisant le backtrace. La méthode to_native_charset appelle detect_charset, où se trouvait le problème.

+0

je vous remercie beaucoup! qui l'a résolu: D –

+0

Ne résous pas mon problème, j'utilise mécanise 2.0.1 – Dzmitry

0

Dans mon cas, un Mechanize::File a été retourné par la méthode get qui n'utilise pas du tout l'encodage.
J'ai été en mesure de résoudre le problème en convertissant manuellement avec Iconv, mais cela ne fonctionne que si vous connaissez déjà l'encodage.

result = @agent.get uri 
# Mechanize::File instead of Mechanize::Page is returned 
# so we have to convert manually 
result = Iconv.conv("utf-8", "iso-8859-1", result.body)