怎么处理惩罚requests中的乱码题目
添加时间:2013-5-7 点击量:
长久专注于写爬虫,受够了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
容易发怒的意思就是: 别人做了蠢事, 然后我们代替他们, 表现出笨蛋的样子。—— 蔡康永
长久专注于写爬虫,受够了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
容易发怒的意思就是: 别人做了蠢事, 然后我们代替他们, 表现出笨蛋的样子。—— 蔡康永