php网页抓取乱码(r.encoding用于解码的编码格式并赋值解决问题的关键)
优采云 发布时间: 2021-12-22 18:12php网页抓取乱码(r.encoding用于解码的编码格式并赋值解决问题的关键)
请求简称为 r
在读取请求的响应内容时,如果没有设置r.encoding(获取响应内容r.text时用于解码的编码格式),经常读取的r.text会出现乱码
原因:
响应内容的原创格式与程序解码r.text使用的格式不同,导致乱码
1.requests.get() 简要说明
函数原型如图,requests.get()用于发送请求,最终得到响应,返回值为响应对象,如图
2.响应对象的处理(响应和编码)
当我们想要获取响应的内容时,通常我们使用:
那么,我们在使用requests.get().text获取响应内容的时候,就需要考虑编码问题,这涉及到编码的设置
编码的作用/意义是什么?即:
访问 r.text 时要解码的编码。
就是说encoding指定解码requests.get().text时使用的编码格式
如果未设置编码会怎样?
当我们不主动设置编码时,程序仍然会根据http头自动猜测下载网页的编码格式,并应用于requests.get().text的解码
举个例子:
import requests
import chardet
r=requests.get('http://www.baidu.com')
print('content:',r.content)
print('text:',r.text)
print('encoding:',r.encoding)
查看控制台输出:
这里只截取了r.text和r.encoding
我们可以看到r.text显示乱码,r.encoding自动猜测返回ISO-8859-1格式。这也是r.text出现乱码的原因。原创格式和解码后的格式不匹配(这里原来的实际编码格式是“utf-8”)
获取原创编码格式并赋值给encoding是解决乱码问题的关键
3.获取响应内容编码格式的两种方式(下载网页)3.1 requests.utils.get_encodings_from_content()
此方法由请求提供。用于获取传入字符串的编码格式并返回。得到正确的编码格式后,赋值给encoding
程序:
import chardet
r=requests.get('http://www.baidu.com')
print('content:',r.content)
print('text:',r.text)
print('encoding:',r.encoding)
#2
r.encoding=requests.utils.get_encodings_from_content(r.text)
print('text_changed:',r.text)
控制台输出:
如上两张图,设置后格式正常
3.2 使用 chardet 模块
Chardet 是一个优秀的字符串/文件编码检测模块
首次安装:
pip install chardet
安装完成后就可以在程序中使用了
import chardet
使用 chardet.detect() 返回字典。字典中的置信度是检测精度,编码是检测到的编码形式。通常我们会直接将chardet检测到的编码赋值给r.encoding来实现r.text不出现乱码
示例如下:
import requests
import chardet
r=requests.get('http://www.baidu.com')
print('content:',r.content)
print('text:',r.text)
print('encoding:',r.encoding)
'''
#返回一个字典:编码格式、检测精确度
'''
print(chardet.detect(r.content))
r.encoding=chardet.detect(r.content)['encoding']
print('text_changed2:',r.text)
两个方法分享完毕。还有其他方法可以防止请求读取响应内容时出现乱码。欢迎交流。