Python网络爬虫出现乱码问题的解决方法


Posted in Python onJanuary 05, 2017

关于爬虫乱码有很多各式各样的问题,这里不仅是中文乱码,编码转换、还包括一些如日文、韩文 、俄文、藏文之类的乱码处理,因为解决方式是一致的,故在此统一说明。

网络爬虫出现乱码的原因

源网页编码和爬取下来后的编码格式不一致。
如源网页为gbk编码的字节流,而我们抓取下后程序直接使用utf-8进行编码并输出到存储文件中,这必然会引起乱码 即当源网页编码和抓取下来后程序直接使用处理编码一致时,则不会出现乱码; 此时再进行统一的字符编码也就不会出现乱码了

注意区分

  • 源网编码A、
  • 程序直接使用的编码B、
  • 统一转换字符的编码C。

乱码的解决方法

确定源网页的编码A,编码A往往在网页中的三个位置

1.http header的Content-Type
获取服务器 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://3water.com/').read() 
import chardet 
chardet.detect(rawdata) 
{'confidence': 0.99, 'encoding': 'GB2312'}

chardet可以直接用detect函数来检测所给字符的编码。函数返回值为字典,有2个元素,一个是检测的可信度,另外一个就是检测到的编码。

在开发自用爬虫过程中如何处理汉字编码?
下面所说的都是针对python2.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://3water.com/').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代码文件的编码
py文件默认是ASCII编码,中文在显示时会做一个ASCII到系统默认编码的转换,这时就会出错:SyntaxError: Non-ASCII character。需要在代码文件的第一行添加编码指示:

# -*- coding:utf-8 -*- 
 
print '中文'

像上面那样直接输入的字符串是按照代码文件的编码'utf-8'来处理的
如果用unicode编码,以下方式:

s1 = u'中文' #u表示用unicode编码方式储存信息

decode是任何字符串具有的方法,将字符串转换成unicode格式,参数指示源字符串的编码格式。
encode也是任何字符串具有的方法,将字符串转换成参数指定的格式。

更多内容请参考专题《python爬取功能汇总》进行学习。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python实现自动登录人人网并采集信息的方法
Jun 28 Python
在MAC上搭建python数据分析开发环境
Jan 26 Python
Python使用defaultdict读取文件各列的方法
May 11 Python
Python实现的爬虫功能代码
Jun 24 Python
解决Pycharm无法import自己安装的第三方module问题
May 18 Python
使用python对文件中的数值进行累加的实例
Nov 28 Python
详解python中sort排序使用
Mar 23 Python
Python完成毫秒级抢淘宝大单功能
Jun 06 Python
flask框架jinja2模板与模板继承实例分析
Aug 01 Python
Python浮点数四舍五入问题的分析与解决方法
Nov 19 Python
如何配置关联Python 解释器 Anaconda的教程(图解)
Apr 30 Python
Python批量修改xml的坐标值全部转为整数的实例代码
Nov 26 Python
python fabric实现远程部署
Jan 05 #Python
python 捕获 shell/bash 脚本的输出结果实例
Jan 04 #Python
python 捕获shell脚本的输出结果实例
Jan 04 #Python
完美解决Python2操作中文名文件乱码的问题
Jan 04 #Python
python去除空格和换行符的实现方法(推荐)
Jan 04 #Python
python去掉行尾的换行符方法
Jan 04 #Python
python对json的相关操作实例详解
Jan 04 #Python
You might like
php下一个阿拉伯数字转中文数字的函数
2007/07/16 PHP
PHP环形链表实现方法示例
2017/09/15 PHP
PHP 中魔术常量的实例详解
2017/10/26 PHP
php使用pecl方式安装扩展操作示例
2019/08/12 PHP
Git命令之分支详解
2021/03/02 PHP
javascript 面向对象全新理练之继承与多态
2009/12/03 Javascript
jQuery的一些特性和用法整理小结
2010/01/13 Javascript
jquery ui 1.7 ui.tabs 动态添加与关闭(按钮关闭+双击关闭)
2010/04/01 Javascript
深入领悟JavaScript中的面向对象
2013/11/18 Javascript
详解JavaScript的while循环的使用
2015/06/03 Javascript
如何处理JSON中的特殊字符
2016/11/30 Javascript
Angular实现图片裁剪工具ngImgCrop实践
2017/08/17 Javascript
vue实现评论列表功能
2019/10/25 Javascript
[02:55]2018DOTA2国际邀请赛勇士令状不朽珍藏Ⅲ饰品一览
2018/08/01 DOTA
[01:06:43]完美世界DOTA2联赛PWL S3 PXG vs GXR 第二场 12.19
2020/12/24 DOTA
用于统计项目中代码总行数的Python脚本分享
2015/04/21 Python
Python采用Django开发自己的博客系统
2020/09/29 Python
浅谈机器学习需要的了解的十大算法
2017/12/15 Python
python利用pandas将excel文件转换为txt文件的方法
2018/10/23 Python
django 通过URL访问上传的文件方法
2019/07/28 Python
python3 requests库文件上传与下载实现详解
2019/08/22 Python
python二进制读写及特殊码同步实现详解
2019/10/11 Python
python GUI库图形界面开发之PyQt5结合Qt Designer创建信号与槽的详细方法与实例
2020/03/08 Python
Django多层嵌套ManyToMany字段ORM操作详解
2020/05/19 Python
详解pyqt5的UI中嵌入matplotlib图形并实时刷新(挖坑和填坑)
2020/08/07 Python
5款实用的python 工具推荐
2020/10/13 Python
全球知名旅游社区法国站点:TripAdvisor法国
2016/08/03 全球购物
New Balance加拿大官方网站:运动鞋和健身服装
2018/11/19 全球购物
新闻专业毕业生英文求职信
2014/03/19 职场文书
村级换届选举方案
2014/05/10 职场文书
班主任师德师风自我剖析材料
2014/10/02 职场文书
亚布力滑雪场导游词
2015/02/09 职场文书
聋哑人盗窃罪辩护词
2015/05/21 职场文书
公文写作:教你写“建议书”
2019/05/07 职场文书
Oracle安装TNS_ADMIN环境变量设置参考
2021/11/01 Oracle
SQL中的连接查询详解
2022/06/21 SQL Server