Python之chardet模块使用

字符串编码一直是令人非常头疼的问题,虽然Python提供了Unicode表示的str和bytes两种数据类型,并且可以通过encode()和decode()方法转换,但是,在不知道编码的情况下,对bytes做decode()不好做。

对于未知编码的bytes,要把它转换成str,需要先“猜测”编码。猜测的方式是先收集各种编码的特征字符,根据特征字符判断,就能有很大概率“猜对”。

当然,我们肯定不能从头自己写这个检测编码的功能,这样做费时费力。chardet这个第三方库正好就派上了用场。用它来检测编码,简单易用。

安装chardet

1
sudo pip install chardet

主要方法

  • detect():检查编码

代码测试

1
2
3
4
5
6
7
8
9
10
11
12
# 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
DEBUG - {'confidence': 1.0, 'language': '', 'encoding': 'ascii'}
DEBUG - {'confidence': 0.99, 'language': '', 'encoding': 'utf-8'}

实际运行案例

在采集网页时,可能遇到gb2312编码的页面,可利用chardet判断,例如:

1
2
3
4
5
6
7
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))
有用就打赏一下作者吧!