我找到了一些使用post_connect_hook
和pre_connect_hook
的解决方案,但似乎它们无效。我正在使用最新的Mechanize版本(2.1)。新版本中没有[:response]
个字段,我不知道在新版本中将它们放到哪里。
是否可以让Mechanize返回UTF8编码版本,而不必使用iconv
手动转换?
答案 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'
)。