爬虫学习_04乱码处理

版权声明:转载请注明出处 https://blog.csdn.net/nanhuaibeian/article/details/85572918

1. 编码方式属性

GB2312 UTF-8 Unicode
GB2312编码专门用来解决中文编码的,是双字节的,并且不论中英文都是双字节的;包含全部中文字符;总的来说GB2312编码方式的编码是以中国国情而创造的,在国际上的兼容性不好。 UTF-8 编码是Unicode的一种实现方式,因为对于大多数语言,只需要一个字节就能够编码,如果都采用Unicode会极大浪费,于是出现了可变长编码UTF-8。它对英文使用8位(即一个字节),中文使用24位(三个字节)来编码。另外,如果是外国人访问你的GB2312网页,需要下载中文语言包支持。访问UTF-8编码的网页则不出现这问题。可以直接访问。这也是为什么大多数的网页是使用UTF-8编码而不是GB2312。 目前几乎收纳了全世界大部分的字符。所有的字符都有唯一的编号,这就解决了解码的冲突!但是,unicode把大家都归纳进来,却没有为编码的二进制传输和二进制解码做出规定。
#Python 2.7 默认UTF8
'你好' ->'\xe4\xbd\xa0\xe5\xa5\xbd'
'你好'.decode('utf8') -> 转换为Unicode u'\u4f60\u597d'
#Python 3.6 默认Unicode
'你好'.encode('utf8') -> 转换为UTF8 编码

2. 转码函数

decode encode
decode的作用是将其他编码的字符串转换成unicode编码,如str1.decode(‘gb2312’),表示将gbk编码的字符串str1转换成unicode编码。 encode的作用是将unicode编码转换成其他编码的字符串,如str2.encode(‘gb2312’),表示将unicode编码的字符串str2转换成gbk编码。

3. 乱码原因

源网页编码和爬取下来后的编码转换不一致。如源网页为gbk编码的字节流,而我们抓取下后程序直接使用utf-8进行编码并输出到存储文件中,这必然会引起乱码,即当源网页编码和抓取下来后程序直接使用处理编码一致时,则不会出现乱码,此时再进行统一的字符编码也就不会出现乱码了。

4. test.content 和 test.text的区别

对requests获取的原始数据,有两种获取形式,一个是test.content一个是test.text。
二者的区别在于content返回的是byte型数据,而text返回的是Unicode数据,
也就是说text对原始数据进行的特殊的编码,而这个编码方式是基于对原始数据的猜测(响应头)。
text返回的是unicode 型的数据,一般是在网页的header中定义的编码形式。
content返回的是bytes,二级制型的数据。
但是对于某些网站的中文用text可能会导致返回乱码,所以最好是使用content然后自己进行重新编码,而且如果你想要提取图片、文件,也要用到content。

#.content打印的是原始编码
import requests
url = 'http://www.pocketuni.net/'
response = requests.get(url)
response.encoding = 'utf-8'
print (response.content)

在这里插入图片描述

#使用.test打印数据
import requests
url = 'http://www.pocketuni.net/'
response = requests.get(url)
response.encoding = 'utf-8'
print(response.content.decode('utf-8'))
#实际上response.text和response.content.decode('utf-8')效果相同

在这里插入图片描述

5. 寻找到目标网页的编码格式

  1. 查看网页源代码
  2. 检查元素,查看Response Headers

猜你喜欢

转载自blog.csdn.net/nanhuaibeian/article/details/85572918