python3以前版本的最头痛问题就是编码的转换,在爬取不同网页的时候发现编码有N多种,目前已爬取到的网页编码如下:
gbk |
utf-8 |
UTF-8-SIG |
SHIFT_JIS |
GB2312 |
Big5 |
EUC-JP |
ascii |
CP932 |
EUC-KR |
UTF-16 |
ISO-8859-5 |
IBM866 |
ISO-8859-1 |
Windows-1252 |
ISO-8859-9 |
我们这里使用chardet识别编码格式,并把它转换为统一的编码:
import chardet
import urllib2
html = urllib2.urlopen("http://xxx.xxxx.xxxx").read()
detRes = chardet.detect(html) #html = urllib2.urlopen().read()函数的返回结果
charset = detRes["encoding"]
html = html.decode(charset,"ignore")#依据分析结果进行解码,将源编码解码为unicode
utf8Str=html.encode("utf8",'ignore')#编码为自己需要的字符集,这里以utf8为例
使用chardet因为要进行全文编码检测,执行效率比较低,针对几万个字符或几十万字符的网页就会有明显延迟现象,也可以只截取一部分内容进行检测,以加快程序执行效率。
另外的方法有通过查找页面 meta标签的charset属性进行判断,这个方法能适应大部分网页且效率比chardet高,但有小部分网页也无法正确解码,大家可以自行测试。