Python爬虫乱码全解:从编码识别到chardet实战
本文详解Python网络爬虫中常见的乱码问题,涵盖中文、日文等多语言编码处理。通过解析HTTP Header、Meta标签及Document定义确定源编码,并介绍使用chardet库自动检测编码的方法。结合Python 2.7实例,演示如何正确进行字符串解码与编码转换,确保数据准确存储。
网络爬虫开发中遇到的乱码问题种类繁多,不仅限于中文,还涉及日文、韩文、俄文、藏文等多种语言的编码转换与处理。由于各类乱码的解决逻辑基本一致,本文将对这些情况统一进行说明和梳理。
网络爬虫出现乱码的原因
乱码产生的根本原因在于源网页的编码格式与爬取后程序使用的编码格式不一致。例如,若源网页以gbk编码的字节流形式存在,而抓取程序直接使用utf-8进行编码并写入存储文件,必然导致乱码。反之,如果源网页编码与程序处理编码保持一致,或者在抓取后进行了统一的字符编码转换,则不会出现乱码现象。
注意区分
- 源网页编码A
- 程序直接使用的编码B
- 统一转换字符的编码C
乱码的解决方法
首先需要确定源网页的编码A,该编码信息通常隐藏在网页的三个关键位置中。
1. HTTP Header中的Content-Type 服务器通过HTTP Header告知浏览器页面内容的相关信息,其中Content-Type字段通常写作“text/html; charset=utf-8”,指明了页面的字符集编码。
2. Meta标签中的charset属性
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
3. 网页头部的Document定义
<script type="text/javascript">
if(document.charset){
alert(document.charset+"!!!!");
document.charset = 'GBK';
alert(document.charset);
}
else if(document.characterSet){
alert(document.characterSet+"????");
document.characterSet = 'GBK';
alert(document.characterSet);
}
在获取源网页编码时,应按顺序检查上述三部分数据,其优先级依次递减。若以上三者均未提供编码信息,则通常采用chardet等第三方智能编码识别工具进行自动判断。
安装: pip install chardet
官方网站: http://chardet.readthedocs.io/en/latest/usage.html
Python chardet 字符编码判断
使用chardet可以便捷地实现字符串或文件的编码检测。尽管HTML页面中通常包含charset标签,但这些标签有时并不准确,此时chardet能发挥重要作用。 chardet实例
import urllib
rawdata = urllib.urlopen('https://www.jb51.net/').read()
import chardet
chardet.detect(rawdata)
{'confidence': 0.99, 'encoding': 'GB2312'}
chardet库提供detect函数,可直接检测给定字符串的编码。该函数返回一个字典,包含两个元素:一个是检测的可信度(confidence),另一个是检测到的编码格式(encoding)。
在开发自用爬虫过程中如何处理汉字编码? 以下说明基于Python 2.7环境。若不进行额外处理,采集到的数据往往显示为乱码。解决方法是将HTML内容统一转换为utf-8编码。需要注意的是,如果遇到windows-1252编码,这通常是因为chardet的编码识别训练尚未覆盖该情况所致。
import chardet
a='abc'
type(a)
str
chardet.detect(a)
{'confidence': 1.0, 'encoding': 'ascii'}
a ="我"
chardet.detect(a)
{'confidence': 0.73, 'encoding': 'windows-1252'}
a.decode('windows-1252')
u'\xe6\u02c6\u2018'
chardet.detect(a.decode('windows-1252').encode('utf-8'))
type(a.decode('windows-1252'))
unicode
type(a.decode('windows-1252').encode('utf-8'))
str
chardet.detect(a.decode('windows-1252').encode('utf-8'))
{'confidence': 0.87625, 'encoding': 'utf-8'}
a ="我是中国人"
type(a)
str
{'confidence': 0.9690625, 'encoding': 'utf-8'}
chardet.detect(a)
# -*- coding:utf-8 -*-
import chardet
import urllib2
#抓取网页html
html = urllib2.urlopen('https://www.jb51.net/').read()
print html
mychar=chardet.detect(html)
print mychar
bianma=mychar['encoding']
if bianma == 'utf-8' or bianma == 'UTF-8':
html=html.decode('utf-8','ignore').encode('utf-8')
else:
html =html.decode('gb2312','ignore').encode('utf-8')
print html
print chardet.detect(html)
python代码文件的编码 Python文件默认采用ASCII编码。若文件中包含中文,显示时会尝试将ASCII转换为系统默认编码,这可能导致SyntaxError: Non-ASCII character错误。因此,需要在代码文件的第一行添加编码指示语句。
# -*- coding:utf-8 -*- print '中文'
像上面那样直接输入的字符串是按照代码文件的编码'utf-8'来处理的 若需使用unicode编码,可采用以下方式:
s1 = u'中文' #u表示用unicode编码方式储存信息
decode是字符串对象具有的方法,用于将字符串转换为unicode格式,其参数指示源字符串的编码格式。 encode同样是字符串对象具有的方法,用于将字符串转换为参数指定的目标格式。
更多内容请参考专题《python爬取功能汇总》进行学习。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持本站。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









