长期专注于写爬虫,受够了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
-*-python之禅-*-
Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.