2

私は少しウェブスクレイピングをしようとしていますが、WWW:Mechanize gem はエンコーディングを好まないようで、クラッシュします。
投稿リクエストの結果、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
4

2 に答える 2

3

そのページは間違いなく UTF-8 ですが、Mechanize は NKF (コア Ruby ライブラリ) を使用してエンコーディングを推測し、何らかの理由で Shift JIS として表示されます。この問題を回避する最も簡単な方法は、Mechanize のエンコーディング マッピングをオーバーライドすることです。これにより、Iconv を使用してボディを UTF-8 に変換しようとすると、ソース エンコーディングも UTF-8 として渡されます。次のように実行できます。

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

requireMechanize ライブラリの行の直後に配置します。問題の根本原因を見つけて、必要に応じてパッチを送信した直後に値を元に戻すこともできます。

注: これを解決する方法は、バックトレースを使用して Mechanize ライブラリをデバッグすることでした。問題があったメソッドto_native_charset呼び出し。detect_charset

于 2009-02-25T15:12:55.517 に答える
0

私の場合、Mechanize::Fileエンコーディングをまったく使用しない get メソッドによって a が返されました。
で手動で変換することで修正できました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)
于 2013-02-04T15:42:45.453 に答える