Python之chardet模块使用
字符串编码一直是令人非常头疼的问题,虽然Python提供了Unicode表示的str和bytes两种数据类型,并且可以通过encode()和decode()方法转换,但是,在不知道编码的情况下,对bytes做decode()不好做。
对于未知编码的bytes,要把它转换成str,需要先“猜测”编码。猜测的方式是先收集各种编码的特征字符,根据特征字符判断,就能有很大概率“猜对”。
当然,我们肯定不能从头自己写这个检测编码的功能,这样做费时费力。chardet这个第三方库正好就派上了用场。用它来检测编码,简单易用。
# 安装chardet
sudo pip install chardet
1
# 主要方法
- detect():检查编码
# 代码测试
# encoding=utf-8
import logging
import chardet
logging.basicConfig(level = logging.DEBUG, format='%(levelname)s - %(message)s')
logger = logging.getLogger(__name__)
logger.debug(chardet.detect(b'hello world!'))
logger.debug(chardet.detect(r'离离原上草,一岁一枯荣'))
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
输出结果:
DEBUG - {'confidence': 1.0, 'language': '', 'encoding': 'ascii'}
DEBUG - {'confidence': 0.99, 'language': '', 'encoding': 'utf-8'}
1
2
2
# 实际运行案例
在采集网页时,可能遇到gb2312编码的页面,可利用chardet判断,例如:
try:
# 获取文章编码(中文编码特殊处理)
res_code = chardet.detect(res)
if res_code.get('encoding').lower() == 'gb2312':
res = res.decode('gbk', 'ignore')
except Exception as e:
print('GB2312编码处理失败 错误%s' % str(e))
1
2
3
4
5
6
7
2
3
4
5
6
7
上次更新: 2022/12/01, 11:09:34