php网页抓取乱码(r.encoding用于解码的编码格式并赋值解决问题的关键)

优采云 发布时间: 2021-12-22 18:12

  php网页抓取乱码(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)

  

  两个方法分享完毕。还有其他方法可以防止请求读取响应内容时出现乱码。欢迎交流。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线