Mechanize on Ruby 1.9.3 encoding issue

2019-08-23 17:59发布

问题:

Using the following code (from the Mechanize site but in a rake task)..

namespace :ans do
task :grab => :environment do

a = Mechanize.new { |agent|
  agent.user_agent_alias = 'Mac Safari'
}
begin
a.get('http://google.com/') do |page|
  search_result = page.form_with(:name => 'f') do |search|
    search.q = 'Hello world'
  end.submit

  search_result.links.each do |link|
    puts link.text
  end
end
end
end
end

I get an encoding error..

rake aborted!
"\x8B" from ASCII-8BIT to UTF-8

This is whilst using the following:

Rails 3.1.3
ruby 1.9.3p0 (2011-10-30 revision 33570) [x86_64-linux]
Gems included by the bundle:
  * actionmailer (3.1.3)
  * actionpack (3.1.3)
  * activemodel (3.1.3)
  * activerecord (3.1.3)
  * activeresource (3.1.3)
  * activesupport (3.1.3)
  * ansi (1.4.1)
  * arel (2.2.1)
  * builder (3.0.0)
  * bundler (1.0.21)
  * coffee-rails (3.1.1)
  * coffee-script (2.2.0)
  * coffee-script-source (1.2.0)
  * domain_name (0.5.1)
  * erubis (2.7.0)
  * execjs (1.2.13)
  * hike (1.2.1)
  * i18n (0.6.0)
  * jquery-rails (1.0.19)
  * json (1.6.4)
  * mail (2.3.0)
  * mechanize (2.1)
  * mime-types (1.17.2)
  * multi_json (1.0.4)
  * net-http-digest_auth (1.2)
  * net-http-persistent (2.3.3)
  * nokogiri (1.5.0)
  * ntlm-http (0.1.1)
  * pg (0.12.2)
  * polyglot (0.3.3)
  * rack (1.3.6)
  * rack-cache (1.1)
  * rack-mount (0.8.3)
  * rack-ssl (1.3.2)
  * rack-test (0.6.1)
  * rails (3.1.3)
  * railties (3.1.3)
  * rake (0.9.2.2)
  * rdoc (3.12)
  * sass (3.1.12)
  * sass-rails (3.1.5)
  * sprockets (2.0.3)
  * thor (0.14.6)
  * tilt (1.3.3)
  * treetop (1.4.10)
  * turn (0.8.3)
  * tzinfo (0.3.31)
  * uglifier (1.2.1)
  * unf (0.0.4)
  * unf_ext (0.0.4)
  * webrobots (0.0.12)

rake ans:grab --trace
** Invoke ans:grab (first_time)
** Invoke environment (first_time)
** Execute environment
** Execute ans:grab
rake aborted!
"\x8B" from ASCII-8BIT to UTF-8
/home/andy/.rvm/gems/ruby-1.9.3-p0/gems/mechanize-2.1/lib/mechanize/http/agent.rb:807:in `block in response_read'
/home/andy/.rvm/rubies/ruby-1.9.3-p0/lib/ruby/1.9.1/net/protocol.rb:395:in `call_block'
/home/andy/.rvm/rubies/ruby-1.9.3-p0/lib/ruby/1.9.1/net/protocol.rb:386:in `<<'
/home/andy/.rvm/rubies/ruby-1.9.3-p0/lib/ruby/1.9.1/net/protocol.rb:90:in `read'
/home/andy/.rvm/rubies/ruby-1.9.3-p0/lib/ruby/1.9.1/net/http.rb:2776:in `read_chunked'
/home/andy/.rvm/rubies/ruby-1.9.3-p0/lib/ruby/1.9.1/net/http.rb:2750:in `read_body_0'
/home/andy/.rvm/rubies/ruby-1.9.3-p0/lib/ruby/1.9.1/net/http.rb:2710:in `read_body'
/home/andy/.rvm/gems/ruby-1.9.3-p0/gems/mechanize-2.1/lib/mechanize/http/agent.rb:795:in `response_read'
/home/andy/.rvm/gems/ruby-1.9.3-p0/gems/mechanize-2.1/lib/mechanize/http/agent.rb:267:in `block in fetch'
/home/andy/.rvm/rubies/ruby-1.9.3-p0/lib/ruby/1.9.1/net/http.rb:1322:in `block (2 levels) in transport_request'
/home/andy/.rvm/rubies/ruby-1.9.3-p0/lib/ruby/1.9.1/net/http.rb:2671:in `reading_body'
/home/andy/.rvm/rubies/ruby-1.9.3-p0/lib/ruby/1.9.1/net/http.rb:1321:in `block in transport_request'
/home/andy/.rvm/rubies/ruby-1.9.3-p0/lib/ruby/1.9.1/net/http.rb:1316:in `catch'
/home/andy/.rvm/rubies/ruby-1.9.3-p0/lib/ruby/1.9.1/net/http.rb:1316:in `transport_request'
/home/andy/.rvm/rubies/ruby-1.9.3-p0/lib/ruby/1.9.1/net/http.rb:1293:in `request'
/home/andy/.rvm/gems/ruby-1.9.3-p0/gems/net-http-persistent-2.3.3/lib/net/http/persistent.rb:621:in `request'
/home/andy/.rvm/gems/ruby-1.9.3-p0/gems/mechanize-2.1/lib/mechanize/http/agent.rb:264:in `fetch'
/home/andy/.rvm/gems/ruby-1.9.3-p0/gems/mechanize-2.1/lib/mechanize.rb:319:in `get'
/home/andy/.rvm/gems/ruby-1.9.3-p0/gems/mechanize-2.1/lib/mechanize.rb:428:in `submit'
/home/andy/.rvm/gems/ruby-1.9.3-p0/gems/mechanize-2.1/lib/mechanize/form.rb:178:in `submit'
/home/andy/foo/lib/tasks/fplJsonParse.rake:38:in `block (3 levels) in <top (required)>'
/home/andy/.rvm/gems/ruby-1.9.3-p0/gems/mechanize-2.1/lib/mechanize.rb:321:in `get'
/home/andy/foo/lib/tasks/fplJsonParse.rake:37:in `block (2 levels) in <top (required)>'
/home/andy/.rvm/gems/ruby-1.9.3-p0/gems/rake-0.9.2.2/lib/rake/task.rb:205:in `call'
/home/andy/.rvm/gems/ruby-1.9.3-p0/gems/rake-0.9.2.2/lib/rake/task.rb:205:in `block in execute'
/home/andy/.rvm/gems/ruby-1.9.3-p0/gems/rake-0.9.2.2/lib/rake/task.rb:200:in `each'
/home/andy/.rvm/gems/ruby-1.9.3-p0/gems/rake-0.9.2.2/lib/rake/task.rb:200:in `execute'
/home/andy/.rvm/gems/ruby-1.9.3-p0/gems/rake-0.9.2.2/lib/rake/task.rb:158:in `block in invoke_with_call_chain'
/home/andy/.rvm/rubies/ruby-1.9.3-p0/lib/ruby/1.9.1/monitor.rb:211:in `mon_synchronize'
/home/andy/.rvm/gems/ruby-1.9.3-p0/gems/rake-0.9.2.2/lib/rake/task.rb:151:in `invoke_with_call_chain'
/home/andy/.rvm/gems/ruby-1.9.3-p0/gems/rake-0.9.2.2/lib/rake/task.rb:144:in `invoke'
/home/andy/.rvm/gems/ruby-1.9.3-p0/gems/rake-0.9.2.2/lib/rake/application.rb:116:in `invoke_task'
/home/andy/.rvm/gems/ruby-1.9.3-p0/gems/rake-0.9.2.2/lib/rake/application.rb:94:in `block (2 levels) in top_level'
/home/andy/.rvm/gems/ruby-1.9.3-p0/gems/rake-0.9.2.2/lib/rake/application.rb:94:in `each'
/home/andy/.rvm/gems/ruby-1.9.3-p0/gems/rake-0.9.2.2/lib/rake/application.rb:94:in `block in top_level'
/home/andy/.rvm/gems/ruby-1.9.3-p0/gems/rake-0.9.2.2/lib/rake/application.rb:133:in `standard_exception_handling'
/home/andy/.rvm/gems/ruby-1.9.3-p0/gems/rake-0.9.2.2/lib/rake/application.rb:88:in `top_level'
/home/andy/.rvm/gems/ruby-1.9.3-p0/gems/rake-0.9.2.2/lib/rake/application.rb:66:in `block in run'
/home/andy/.rvm/gems/ruby-1.9.3-p0/gems/rake-0.9.2.2/lib/rake/application.rb:133:in `standard_exception_handling'
/home/andy/.rvm/gems/ruby-1.9.3-p0/gems/rake-0.9.2.2/lib/rake/application.rb:63:in `run'
/home/andy/.rvm/gems/ruby-1.9.3-p0/gems/rake-0.9.2.2/bin/rake:33:in `<top (required)>'
/home/andy/.rvm/gems/ruby-1.9.3-p0/bin/rake:19:in `load'
/home/andy/.rvm/gems/ruby-1.9.3-p0/bin/rake:19:in `<main>'
Tasks: TOP => ans:grab

回答1:

just install the previous mechanize version:

gem install mechanize -v 2.0.1

or

gem 'mechanize', '2.0.1' and `bundle update`

I've been getting the same issue with 2.1 btw, there's an ongoing discussion on mechanize github regarding it