python3 爬虫html乱码,Python3爬虫之中文乱码问题分析与解决方法

前言:

今天简单爬取一个网页的源代码时,发现出现了乱码

python代码:

import requests

req = requests.get("http://www.ccit.js.cn")

req_text = req.text

print(req_text)1

2

3

4

5

部分截图:

7b6c8bb143ad55150d25dc61cf2cb9e8.png

分析:出现这样的情况是什么原因呢?

(1)我们先来测试一下python3的默认编码是什么

import sys

print('目前系统的编码为:',sys.getdefaultencoding())

name1="惊鸿一面"

name2=name1.encode("utf-8")#str通过(encode)转为bytes

print("name1的类型:",type(name1))

print("name2的类型",type(name2))

print(name2)1

2

3

4

5

6

7

8

运行结果:

5a5e9738a544f13475947a93c9a73ecb.png

(2)知识点:

python3默认编码为utf-8(unicode的一个子集,也是属于unicode,这也就是为什么有人说python3的默认编码是unicode,实际上是和utf-8是一样的)

字符串用str表示,编码后的字符串用二进制bytes表示

字符串通过编码转换为字节码,字节码通过解码转换为字符串

str通过(encode)转为bytes,bytes通过(decode)转为str

(3)原因总结:

Python3的默认编码是utf-8,所有的数据他都会以utf-8进行编码(encode)。因此,Python3将目标网站的源码爬取之后进行utf-8编码,但我们所爬取的目标网站是GB2312编码,与Python3的默认编码不同,因而造成乱码

解决方案:

使用通用的编码格式

(4)注:

str类型的对象都是unicode,因此对于str类型的对象只有encode()方法,没有decode()方法(如果运行,会报错)

原因是:只有bytes(二进制)的值才能decode,你字符串是吗??!!

避免出现乱码的准则:

遵循编码使用哪种格式,解码就使用哪种格式。

出现类似UnicodeEncodeError: 'gb2312' codec can't encode character '\xb3' in position 293: illegal multibyte sequence的原因是,你需要解码的文件中有些中文字符无法进行解码(有些中文字符是不在GB2312范围内的)

此时,我们可以使用它GBK或者它的父集GB18030

(5)我们以几种常见的编码格式进行encode测试

import requests

req= requests.get("http://www.ccit.js.cn")

req_text1=req.text.encode("utf-8")

req_text2=req.text.encode("GB2312")

req_text3=req.text.encode("GB18030")

print(req_text1)#成功编码成bytes

print(req_text2)#UnicodeEncodeError: 'gb2312' codec can't encode character '\xb3' in position 293: illegal multibyte sequence

print(req_text3)#成功编码成bytes1

2

3

4

5

6

7

8

(6)接着上面又做了decode测试,遵行编码使用准则,但是还是乱码!!

import requests

req= requests.get("http://www.ccit.js.cn")

req_text1=req.text.encode("utf-8").decode("utf-8")

req_text2=req.text.encode("utf-8").decode("GB2312")

req_text3=req.text.encode("utf-8").decode("GB18030")

req_text4=req.text.encode("GB18030").decode("utf-8")

req_text5=req.text.encode("GB18030").decode("GB2312")

req_text6=req.text.encode("GB18030").decode("GB18030")

print(req_text1)#成功但是乱码

print(req_text2)#UnicodeDecodeError: 'gb2312' codec can't decode byte 0xc3 in position 297: illegal multibyte sequence

print(req_text3)#成功但是乱码

print(req_text4)#UnicodeDecodeError: 'utf-8' codec can't decode byte 0x81 in position 293: invalid start byte

print(req_text5)#UnicodeDecodeError: 'gb2312' codec can't decode byte 0x81 in position 293: illegal multibyte sequence

print(req_text6)#成功但是乱码1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

解决方法:

那到底怎样才能解决呢???请看如下代码:

import requests

req= requests.get("http://www.ccit.js.cn")

req_text=req.text.encode("latin1").decode("GBK")

print(req_text)1

2

3

4

这里进行encode时使用了latin1。

Latin1是ISO-8859-1的别名,有些环境下写作Latin-1。ISO-8859-1编码是单字节编码,向下兼容ASCII,其编码范围是0x00-0xFF,0x00-0x7F之间完全和ASCII一致,0x80-0x9F之间是控制字符,0xA0-0xFF之间是文字符号。

因为ISO-8859-1编码范围使用了单字节内的所有空间,在支持ISO-8859-1的系统中传输和存储其他任何编码的字节流(bytes)都不会被抛弃。换言之,把其他任何编码的字节流当作ISO-8859-1编码看待都没有问题。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值