Python爬虫乱码处理实战:编码检测与转换技巧
本文探讨Python爬虫中常见的乱码问题,介绍如何利用chardet库自动检测网页编码,并通过unicode解码与encode编码将不同字符集(如Big5、GBK、EUC-JP)统一转换为UTF-8,确保数据顺利存入MySQL数据库。
Python信息抽取之乱码解决办法
本文仅针对实际遇到的情况进行说明,情况不同的读者可略过,若遇到相同问题可供参考。
在使用Python进行信息抓取时,通常结合使用beautifulSoup、lxml、re、urllib2等库获取页面内容,并通过lxml或beautifulSoup解析后插入MySQL数据库。表面上看流程简单,但实际处理中常遇到编码混乱的问题。国内许多网站在指定编码或保存源码时缺乏规范,即使通过工具查看源码头信息显示为UTF-8或GBK,也不代表实际内容编码一致。例如,源码中可能包含<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />,但实际内容编码可能与声明不符,盲目信任会导致抓取失败。
以下提供一套处理流程(具体各库的使用细节不在本文讨论范围内):
import urllib2
import chardet
html = urllib2.urlopen("某网站")
print chardet.detect(html) #这里会输出一个字典{'a':0.99999,'encoding':'utf-8'}
即便获知整个HTML的编码,若直接插入以UTF-8建立的MySQL数据库仍可能报错。这是因为使用lxml解析后的字符串编码可能并非UTF-8,而是Big5(繁体中文)、EUC-JP(日文)或其他未知编码。为解决此问题,可采用unicode方法:先对字段进行解码,再重新编码为目标格式。
if chardet.detect(name)['encoding'] == 'GB2312':
name = unicode(name,'GB2312','ignore').encode('utf-8','ignore')
elif chardet.detect(name)['encoding'] == 'Big5':
name = unicode(name,'Big5','ignore').encode('utf-8','ignore')
elif chardet.detect(name)['encoding'] == 'ascii':
name = unicode(name,'ascii','ignore').encode('utf-8','ignore')
elif chardet.detect(name)['encoding'] == 'GBK':
name = unicode(name,'GBK','ignore').encode('utf-8','ignore')
elif chardet.detect(name)['encoding'] == 'EUC-JP':
name = unicode(name,'EUC-JP','ignore').encode('utf-8','ignore')
else:
name = '未知'
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













