长期专注于写爬虫,受够了urllib、urllib2甚至是urllib3。最后选择了更人性化的requests。可是requsests对中文的支持并不太好,时常会出现乱码问题。研究源码之后现给出解决方案。

乱码的由来:requests的字符检测借用了一个名为chardet的第三方库,如果运行环境缺少这个库的话系统会从别的地方想办法猜测字符集,比如header中的是声明。其实这个第三库和补救的办法往往都不靠谱,而在转换unicode的过程又是通过str方法强制执行的。于是可恶的乱码就这么出现了。

解决方案1:直接使用requests中response对象的content属性,content是未被转换成unicode的返回值。这样一来怎么解码就是调用方可以自己灵活处理的问题了

解决方案2:对requests库进行hack自己写一套合适的字符集检测方法。我自己就是在ultis.py中添加了一个自己的get_encoding方法,然后在models.py中调用了它。

get_encoding 方法实现如下,这个实现未必很完美但至少解决了问题

def get_encoding(s):
    if isinstance(s,unicode):
        return "unicode"
    try:
        r = unicode(s)
        return "ASCII"
    except:
        try:
            r = s.decode("utf8")
            return "utf8"
        except:
            try:
                r = s.decode("gbk")
                return "gbk"
            except:
                try:
                     r = s.decode("latin-1")
                     return "latin-1"
                except:
                    pass

 

 

posted on 2013-05-06 16:20  MoonXue  阅读(506)  评论(3编辑  收藏  举报