python3.x+requests 爬取网站遇到中文乱码的解决方案
http://blog.chinaunix.net/uid-13869856-id-5747417.html
官方文档中response-content相关内容,说明了Requests会自动解码来自服务器的内容。Requests会基于HTTP头部对响应的编码作出有根据的推测,前提是响应文档的HTTP headers里面没有相关字符集说明。官方文档还说明了,如果你创建了自己的编码,并使用codecs 模块进行注册,你就可以轻松地使用这个解码器名称作为 r.encoding 的值, 然后由Requests来为你处理编码。(自己没有使用codecs模块,所以这里不贴代码了,不过按官方的说法使用codecs模块是最简单的一种方式。)
另一份官方文档片段明确说了reponse编码处理方式:Requests遵循RFC标准,编码使用ISO-8859-1 。只有当HTTP头部不存在明确指定的字符集,并且 Content-Type 头部字段包含 text 值之时, Requests才不去猜测编码方式。
import requests req = requests.get("http://news.sina.com.cn/") if req.encoding == 'ISO-8859-1': encodings = requests.utils.get_encodings_from_content(req.text) if encodings: encoding = encodings[0] else: encoding = req.apparent_encoding # encode_content = req.content.decode(encoding, 'replace').encode('utf-8', 'replace') global encode_content encode_content = req.content.decode(encoding, 'replace') #如果设置为replace,则会用?取代非法字符; print(encode_content) with open('test.html','w',encoding='utf-8') as f: f.write(encode_content)
如果需要暴力转换就用str()方法:
res = requests.get('http://www.baidu.com') res = res.content res = str(res,'utf-8')