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语言的12个基础知识点小结
Jul 10 Python
Python常用模块用法分析
Sep 08 Python
python通过socket查询whois的方法
Jul 18 Python
利用Celery实现Django博客PV统计功能详解
May 08 Python
基于python全局设置id 自动化测试元素定位过程解析
Sep 04 Python
Python爬取爱奇艺电影信息代码实例
Nov 26 Python
python序列类型种类详解
Feb 26 Python
tensorflow使用freeze_graph.py将ckpt转为pb文件的方法
Apr 22 Python
matplotlib 画双轴子图无法显示x轴的解决方法
Jul 27 Python
Matplotlib animation模块实现动态图
Feb 25 Python
python基础详解之if循环语句
Apr 24 Python
Python还能这么玩之只用30行代码从excel提取个人值班表
Jun 05 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 截取字符串函数整理(支持gb2312和utf-8)
2010/02/16 PHP
Linux下CoreSeek及PHP扩展模块的安装
2012/09/23 PHP
PHP+MySQL实现的简单投票系统实例
2016/02/24 PHP
php自定义函数br2nl实现将html中br换行符转换为文本输入中换行符的方法【与函数nl2br功能相反】
2017/02/17 PHP
PHP实现简单登录界面
2019/10/23 PHP
js 表单验证方法(实用)
2009/04/28 Javascript
js 实现无缝滚动 兼容IE和FF
2009/07/15 Javascript
js调用activeX获取u盘序列号的代码
2011/11/21 Javascript
js取滚动条的尺寸的函数代码
2011/11/30 Javascript
改变隐藏的input中value值的方法
2014/03/19 Javascript
javascript实现淡蓝色的鼠标拖动选择框实例
2015/05/09 Javascript
jquery实现可关闭的倒计时广告特效代码
2015/09/02 Javascript
JavaScript如何获取数组最大值和最小值
2015/11/18 Javascript
神级程序员JavaScript300行代码搞定汉字转拼音
2017/05/20 Javascript
11行JS代码制作二维码生成功能
2018/03/09 Javascript
JS实现方形抽奖效果
2018/08/27 Javascript
ng-zorro-antd 入门初体验
2018/12/03 Javascript
微信小程序自定义多列选择器使用详解
2019/06/21 Javascript
JS数组扁平化(flat)方法总结详解
2019/06/24 Javascript
Centos7 安装Node.js10以上版本的方法步骤
2019/10/15 Javascript
JS实现“全选”和&quot;全不选&quot;功能代码实例
2020/02/06 Javascript
[01:08]DOTA2次级职业联赛 - Wings 战队宣传片
2014/12/01 DOTA
python通过http下载文件的方法详解
2019/07/26 Python
PyCharm如何导入python项目的方法
2020/02/06 Python
python 图像判断,清晰度(明暗),彩色与黑白实例
2020/06/04 Python
python3中celery异步框架简单使用+守护进程方式启动
2021/01/20 Python
HTML5 背景的显示区域实现
2020/07/09 HTML / CSS
skyn ICELAND官网:冰岛成分天然护肤品
2020/08/24 全球购物
注塑工厂厂长岗位职责
2013/12/02 职场文书
高二物理教学反思
2014/02/08 职场文书
商务助理求职信范文
2014/04/20 职场文书
领导班子四风对照检查材料思想汇报
2014/09/26 职场文书
幼儿园感恩节活动方案
2014/10/06 职场文书
求职自我评价范文
2015/03/09 职场文书
《角的初步认识》教学反思
2016/02/17 职场文书
《风娃娃》教学反思
2016/02/18 职场文书