Iconv :: IllegalSequence при использовании www :: mechanize - PullRequest
2 голосов
/ 25 февраля 2009

Я пытаюсь немного поэкспериментировать, но WWW: Механизировать гем, похоже, не нравится кодировка и вылетает.
Запрос на публикацию приводит к перенаправлению 302 (что механизация следует, пока все хорошо), и получающаяся страница, кажется, дает сбой. Я немного погуглил, но до сих пор не дошло, как это решить. У кого-нибудь из вас есть идея?

Код:

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

Ошибка:

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

Ответы [ 2 ]

3 голосов
/ 25 февраля 2009

Эта страница, скорее всего, UTF-8, однако Mechanize использует NKF (базовую библиотеку Ruby), чтобы угадать кодировку, и по некоторым причинам она называется Shift JIS. Самый быстрый способ обойти эту проблему - переопределить отображение кодировки для Mechanize, чтобы при попытке преобразовать тело в UTF-8 с помощью Iconv он также передавал исходную кодировку как UTF-8. Вы можете сделать это так:

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

Поместите это сразу после строки, где вы require библиотека Механизировать. Возможно, вы захотите установить значение обратно сразу после или, что еще лучше, найти основную причину проблемы и при необходимости подать исправление.

Примечание. Я решил это путем отладки библиотеки Mechanize с использованием backtrace. Метод to_native_charset вызывает detect_charset, в чем проблема.

0 голосов
/ 04 февраля 2013

В моем случае Mechanize::File было возвращено методом get, который вообще не использует кодировку.
Я смог исправить это, вручную преобразовав Iconv, но это работает, только если вы уже знаете кодировку.

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)
...