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实现将n个点均匀地分布在球面上的方法
Mar 12 Python
详解Python中用于计算指数的exp()方法
May 14 Python
python pandas dataframe 行列选择,切片操作方法
Apr 10 Python
Python入门学习指南分享
Apr 11 Python
python版本的仿windows计划任务工具
Apr 30 Python
DES加密解密算法之python实现版(图文并茂)
Dec 06 Python
python根据文章标题内容自动生成摘要的实例
Feb 21 Python
Python assert关键字原理及实例解析
Dec 13 Python
python中对二维列表中一维列表的调用方法
Jun 07 Python
python对一个数向上取整的实例方法
Jun 18 Python
python实现scrapy爬虫每天定时抓取数据的示例代码
Jan 27 Python
python中time.ctime()实例用法
Feb 03 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
extJs 常用到的增,删,改,查操作代码
2009/12/28 Javascript
js函数调用的方式
2014/05/06 Javascript
node.js中Socket.IO的进阶使用技巧
2014/11/04 Javascript
jQuery实现鼠标悬停显示提示信息窗口的方法
2015/04/30 Javascript
跟我学习javascript的全局变量
2015/11/16 Javascript
有关JavaScript中call()和apply() 的一些理解
2016/05/20 Javascript
jQuery实现表格行和列的动态添加与删除方法【测试可用】
2016/08/01 Javascript
功能强大的jquery.validate表单验证插件
2016/11/07 Javascript
自定义PC微信扫码登录样式写法
2017/12/12 Javascript
详解mpvue开发小程序小总结
2018/07/25 Javascript
Iview Table组件中各种组件扩展的使用
2018/10/20 Javascript
微信小程序tabbar底部导航
2018/11/05 Javascript
angular4自定义表单控件[(ngModel)]的实现
2018/11/23 Javascript
详解Vue依赖收集引发的问题
2019/04/22 Javascript
转换layUI的数据表格中的日期格式方法
2019/09/19 Javascript
js 压缩图片的示例(只缩小体积,不更改图片尺寸)
2020/10/21 Javascript
Vue如何循环提取对象数组中的值
2020/11/18 Vue.js
Vue组件生命周期运行原理解析
2020/11/25 Vue.js
[09:47]2018DOTA2亚洲邀请赛4.5SOLO赛 No[o]ne vs Sumail
2018/04/06 DOTA
Python实现多条件筛选目标数据功能【测试可用】
2018/06/13 Python
解决使用pycharm提交代码时冲突之后文件丢失找回的方法
2018/08/05 Python
python中的decimal类型转换实例详解
2019/06/26 Python
django 类视图的使用方法详解
2019/07/24 Python
python使用minimax算法实现五子棋
2019/07/29 Python
python中栈的原理及实现方法示例
2019/11/27 Python
如何在Python对Excel进行读取
2020/06/04 Python
css3边框_动力节点Java学院整理
2017/07/11 HTML / CSS
什么是动态端口(Dynamic Ports)?动态端口的范围是多少?
2014/12/12 面试题
数控技术与应用毕业生自荐信
2013/09/24 职场文书
简单而又朴实的个人求职信分享
2013/12/12 职场文书
在校学生职业规划范文
2014/01/08 职场文书
教师远程培训感言
2014/03/06 职场文书
水电站项目建议书
2014/05/12 职场文书
职代会闭幕词
2015/01/28 职场文书
vue backtop组件的实现完整代码
2021/04/07 Vue.js
pytorch 如何使用float64训练
2021/05/24 Python