目录
我们可以通过审查元素查询网址是使用的哪种编码方式以便指定编码方式
A、在Python 3中,字符串的编码使用str和bytes两种类型。
1、常用网页编码有
- GBK
- GB2312
- UTF-8
2、怎么知道一个网页的编码?
我们知道可以从审查元素(F12)通过查看元素获得。
比如
那么有没有一种方法可以通过代码获取到编码呢?
代码如下:
import requests
import chardet
url = str(input('输入要获取编码的网站'))
req = requests.get(url)
html = req.content
chardet = chardet.detect(html)
print(chardet)
输入网址 我们可以得到以下输出
3、chardet库
上述代码用到了这个库
下面简单介绍一下这个库
1、安装
命令窗口输出一下命令
pip install chardet
检查是否成功有两种方法
可以在(cmd)输入:pip list 查找是否有chardet
也可以通过 看它是否报错来确认
2、chardet.detect()函数
上面代码用了这个函数
detect()它返回一个字典,其中包含自动检测到的字符编码和从0到1的可信度级别。
- encoding:表示字符编码方式。
- confidence:表示可信度。
- language:语言。
我们进入百度网址用审查元素看编码方式为utf-8
或者用第二点的代码可以知道:
3、乱码问题
假如我们执行下列代码:将编码改成 ”GB2312”
import requests
header = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36 Edg/105.0.1343.50 '
}
req = requests.get('https://www.baidu.com/', headers=header)
req.encoding = 'GB2312'
print(req.text)
输出如下:
可以看到出现了乱码:说明没有按照正确编码方式编码
我们可以通过审查元素查询网址是使用的哪种编码方式以便指定编码方式
比如:
req = requests.get('https://www.baidu.com/', headers=header).content.decode('utf-8') print(req)
可以看到没有乱码了
或者利用chardet库来解决:
# -*- coding: utf-8 -*-
"""
@File : 00.py
@author: FxDr
@Time : 2022/11/01 23:48
"""
import requests
import chardet
header = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36 Edg/105.0.1343.50 '
}
req = requests.get('https://www.baidu.com/', headers=header)
req.encoding = chardet.detect(req.content)['encoding']
print(req.text)
像这样:我们设置编码
req.encoding = chardet.detect(req.content)['encoding']
可以看到乱码问题解决
4、Python的字符编码
A、在Python 3中,字符串的编码使用str和bytes两种类型。
(1)str字符串:使用Unicode编码。
(2)bytes字符串:使用将Unicode转化成的某种类型的编码,如UTF-8、GBK。
Python 3的字符串默认编码为str,使用Unicode编码。
B、encode()和decode()
前者的作用是将Unicode编码转换成其他编码的字符串,
而decode的作用是将其他编码的字符串转换成Unicode编码。
示例:
import chardet
s = "你好"
print(s,type(s)) # 你好 <class 'str'>
s_gbk = s.encode('GBK')
print(s_gbk,type(s_gbk)) # b'\xc4\xe3\xba\xc3' <class 'bytes'>
print(chardet.detect(s_gbk)['encoding']) # TIS-620
注意:unicode不可以decode()
已经被编码的UTF-8也不可以再encode()
因为在Python 3中,unicode不可以再被解码
>>假如想把UTF-8转成其他非unicode编码,
必须要先decode成unicode,再encode为其他非unicode编码,如GBK
C、非法字符抛出异常
有时候我们用了一种编码方式,比如爬小说大部分都可以正确解码,但是突然报个错,
说“非法字符”,可能是因为网站用的编码太杂了
所以我们可以让 errors='ignore' 忽悠非法字符
1、decode()第二个参数
为控制错误处理的方式,默认为strict,遇到非法字符时会抛出异常。
>>我们可以把第二个参数设置为其他变量,有以下3种方法:
>>(1)ignore,忽略其中的非法字符,仅显示有效字符。
>>(2)replace,使用符号代替非法字符,如'?'或'\ufffd'。
>>(3)xmlcharrefreplace,使用XML字符引用代替非法字符。
例如下列代码,假设字符串s中有多种编码产生的非法字符
s = "我无语啦"
s1 = s.encode('gbk')
s_deco = s1.decode(encoding='utf-8', errors='replace')
print(s_deco)
UnicodeDecodeError:非法的多字节序列
把decode()第二个参数 errors改为 ‘replace'可以看到不报错了
2、encode()第二个参数也一样
"""
@File : 01.py
@author: FxDr
@Time : 2022/11/02 0:31
"""
s = "我无语了\u2020a"
s1 = s.encode(encoding='gbk').decode('gbk')
print(s1)
加上参数errors='ignore'