【问题标题】:How to set the mechanize page encoding?如何设置机械化页面编码?
【发布时间】:2009-12-12 03:31:43
【问题描述】:

我正在尝试通过单击链接获取带有 ISO-8859-1 编码的页面,因此代码类似于:

page_result = page.link_with( :text => 'link_text' ).click

到目前为止,我得到的结果是错误的编码,所以我看到的字符如下:

'T�tulo:' instead of 'Título:'

我尝试了几种方法,包括:

  • 使用代理在第一个请求中说明编码,例如:

    @page_search = @agent.get(
      :url => 'http://www.server.com',
      :headers => { 'Accept-Charset' => 'ISO-8859-1' } )
    
  • 说明页面本身的编码

      page_result.encoding = 'ISO-8859-1'
    

但我一定是做错了什么:一个简单的 put 总是显示错误的字符。

你知道如何说明编码吗?

提前致谢,

添加:可执行示例:

require 'rubygems'
require 'mechanize'

WWW::Mechanize::Util::CODE_DIC[:SJIS] = "ISO-8859-1"

@agent = WWW::Mechanize.new

@page = @agent.get(
  :url => 'http://www.mcu.es/webISBN/tituloSimpleFilter.do?cache=init&layout=busquedaisbn&language=es',
  :headers => { 'Accept-Charset' => 'utf-8' } )

puts @page.body

【问题讨论】:

    标签: ruby encoding mechanize


    【解决方案1】:

    嘿,你可以做一个:

    agent.page.encoding = 'utf-8'
    

    希望对你有帮助!

    【讨论】:

    • 在实际代码中很难使用'agent.page.encoding',但想法是正确的,非常有帮助,谢谢!
    • 我花了很多时间试图解决这个问题,直到我偶然发现了你的答案——谢谢!
    【解决方案2】:

    前面的答案是正确的,但在我的代码中看起来略有不同:

    agent = Mechanize.new
    
    page = agent.get('http://example.com')
    
    page.encoding = 'windows-1251'
    
    page.search('p').each do |para|
      puts para.text
    end
    

    【讨论】:

    • 谢谢!本技巧修复了有关 ASCII 格式的表单编码的相关问题。
    【解决方案3】:

    对不起,这是我的错误:我来自 Java 背景,并且字符串在内部转换为 utf-16。我忘了Ruby不这样做。 Mechanize 正在完美地恢复页面,但我需要通过 iconv 转换数据。

    注意:Ruby 存储字符串而不转换其编码。

    【讨论】:

    • 如果可能的话,您可能还想尝试 ruby​​ 1.9,他们添加了很多 unicode stuff
    【解决方案4】:

    是的,Mechanize 会尝试检测编码本身(使用 NKF 核心 Ruby 库)来猜测编码)并且有时会失败。

    也许这可能会有所帮助:
    WWW::Mechanize::Util::CODE_DIC[:SJIS] = "ISO-8859-1"

    我不太确定确切的语法,但我认为 CODE_DICT Hash 可能是一个查看的好地方 :)
    不久前我有一个similar problem

    【讨论】:

      猜你喜欢
      • 2013-09-08
      • 1970-01-01
      • 1970-01-01
      • 2023-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-02
      • 2013-07-01
      相关资源
      最近更新 更多