Gem Nokogiri 编码问题解决

wujian_hit · 2012年11月21日 · 最后由 activeliang 回复于 2017年08月24日 · 5694 次阅读
# encoding : utf-8
require 'nokogiri'
require 'open-uri'

#example:baidu encoding:GB2312

html=open("http://www.baidu.com/").read
charset=Nokogiri::HTML(html).meta_encoding#!有些网页没有定义charset则不适用
puts charset
html.force_encoding(charset)
html.encode!("utf-8", :undef => :replace, :replace => "?", :invalid => :replace)
doc = Nokogiri::HTML.parse html
puts doc

或者(个人推荐第二种,这个函数扫便天下)

require 'rchardet19'
def toUtf8(_string)
    cd = CharDet.detect(_string)      #用于检测编码格式  在gem rchardet9里
    if cd.confidence > 0.6
      _string.force_encoding(cd.encoding)
    end
    _string.encode!("utf-8", :undef => :replace, :replace => "?", :invalid => :replace)
    return _string
end

begin
   doc = Nokogiri::HTML(toUtf8(open("http://www.baidu.com/").read))
   puts doc
end

字符编码问题详解:unicode 编码,ruby1.8,ruby1.9 编码机制区别详解: http://about.ac/2012/06/understanding-m17n.html

doc = Nokogiri::HTML(html,nil,"gbk")

这样就可以了,内置编码处理的功能,这样比较靠谱

#1 楼 @huacnlee 不知道是我代码有问题吗?这段好像不好使。

require 'nokogiri'
require 'open-uri'

doc = Nokogiri::HTML(open("http://www.baidu.com/"), nil, 'gb2312')
puts doc

#3 楼 @huacnlee 😭 555~ 两个都不行。 输出还是有乱码...

在设置一个 encoding doc.encoding="网页的编码"

@tomwey 谢谢,解析带中文的 xml 成功

难道是版本问题?作为 ruby 新手,之前看 ruby 说版本号比较小都是因为升级谨慎---为了保持 兼容性。 我 ruby 2.0 下前面几楼的代码都不行, @tomwey 那个管用!我解析 utf-8 链接成功。

#7 楼 @hick 如果你确切的知道 string 的编码类型,#encoding=‘XXX’就行。如果你也不清楚编码是什么的话,可以用 rchatdet19 这个 gem 猜一下字符串的编码,不过猜的也会有不准的时候,特别是当你的 string 很短时。毕竟是猜的。

#1 楼 @huacnlee 加了 nil 之后获取的 html 都少了。。= =

按照 lz 的方式搞定。:)

谢谢分享,解决了我的问题。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号