如何让 Mechanize 自动将内容转换为 UTF8 编码?

5

iconv在Ruby 1.9版本中将被弃用。请查看String.force_encoding。 - phoet
即使我在编码机制钩子中设置了编码、force_encoding和编码后的字符串,Mechanize仍会将编码更改回ASCII-8BIT。一切都是一样的。我猜我需要修改头文件和HTML的meta字符集。 - Dmitry Polushkin
谢谢你的提示。在底部,我已经用新的“encode”方法进行了解释。 - Dmitry Polushkin
您的Gist链接已经失效。 - zhon
@zhon已修复。请检查是否可以提供更多信息帮助。 - Dmitry Polushkin
4个回答

3
自从 Mechanize 2.0 版本以后,pre_connect_hooks()post_connect_hooks() 的参数已经更改。
请参阅 Mechanize 文档:
pre_connect_hooks()

调用HTTP请求前要执行的钩子列表。 钩子将使用代理、URI、响应和响应正文进行调用。

post_connect_hooks()

调用HTTP请求后要执行的钩子列表。 钩子将使用代理、URI、响应和响应正文进行调用。

现在你无法改变内部的响应正文值,因为参数不是数组。 所以,替换一个内部解析器成为最好的方法。
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/')
...

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

目前未发现任何问题。


1
在您的脚本中,只需输入:page.encoding = 'utf-8'。但是,根据您的场景,您可能需要输入反向(Mechanize正在使用的网站编码)而不是这个编码。为此,请打开Firefox,打开您想要Mechanize工作的网站,在菜单栏中选择“工具”,然后打开“页面信息”。从那里确定页面的编码方式。使用该信息,您应该输入页面所编码的方式(例如page.encoding = 'windows-1252')。

0

这样怎么样:

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

无法工作。仍然收到'<html>\r\n<head>\r\n<title>\xCD\xE5\xE4' - Dmitry Polushkin
我同意,最好编写一个调用@agent.get并进行转换的get方法。不过你的问题似乎要求进行猴子补丁。 - pguardiario
1
Monkeypatch太丑了,这个功能应该在mechanize内部实现。https://gist.github.com/480277 - 基本上满足我的需求,但是我无法使用content_encoding_hooks做同样的事情,因为在Page类中,mechanize内部有一些代码将编码转换为ASCII-8BIT,然后无法将其返回到WINDOWS-1251并转换为UTF-8。所以如果您能使用content_encoding_hooks编写代码,请更新您的记录,我会给您+50,并将此问题标记为已解决。谢谢。 - Dmitry Polushkin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接