如何让Mechanize自动将body转换为UTF8?

时间:2012-01-14 18:49:52

标签: ruby utf-8 mechanize

我找到了一些使用post_connect_hookpre_connect_hook的解决方案,但似乎它们无效。我正在使用最新的Mechanize版本(2.1)。新版本中没有[:response]个字段,我不知道在新版本中将它们放到哪里。

是否可以让Mechanize返回UTF8编码版本,而不必使用iconv手动转换?

4 个答案:

答案 0 :(得分:3)

自Mechanize 2.0以来,pre_connect_hooks()post_connect_hooks()的参数发生了变化。

请参阅Mechanize文档:

  

pre_connect_hooks()

     

检索响应之前要调用的挂钩列表。使用代理,URI,响应和响应主体调用挂钩。

  

post_connect_hooks()

     

检索响应后要调用的挂钩列表。使用代理,URI,响应和响应主体调用挂钩。

现在您无法更改内部response-body值,因为参数不是数组。因此,下一个最好的方法是用您自己的内部解析器替换:

class MyParser
  def self.parse(thing, url = nil, encoding = nil, options = Nokogiri::XML::ParseOptions::DEFAULT_HTML, &block)
    # insert your conversion code here. For example:
    # thing = NKF.nkf("-wm0X", thing).sub(/Shift_JIS/,"utf-8") # you need to rewrite content charset if it exists.
    Nokogiri::HTML::Document.parse(thing, url, encoding, options, &block)
  end
end

agent = Mechanize.new
agent.html_parser = MyParser
page = agent.get('http://somewhere.com/')
...

答案 1 :(得分:2)

我找到了一个效果很好的解决方案:

class HtmlParser
  def self.parse(body, url, encoding)
    body.encode!('UTF-8', encoding, invalid: :replace, undef: :replace, replace: '')
    Nokogiri::HTML::Document.parse(body, url, 'UTF-8')
  end
end

Mechanize.new.tap do |web|
  web.html_parser = HtmlParser
end

尚未发现任何问题。

答案 2 :(得分:0)

这样的事情怎么样:

class Mechanize
    alias_method :original_get, :get
    def get *args
        doc = original_get *args
        doc.encoding = 'utf-8'
        doc
    end
end

答案 3 :(得分:0)

在您的脚本中,只需输入:page.encoding = 'utf-8'

但是,根据您的情况,您可能需要输入相反的内容(机械师网站的编码正在使用)。为此,打开Firefox,打开要使用Mechanize的网站,在菜单栏中选择工具,然后打开页面信息。从那里确定页面编码的内容。

使用该信息,您可以输入页面编码的内容(例如page.encoding = 'windows-1252')。