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使用点操作符访问字典(dict)数据的方法
Mar 16 Python
Python实现的简单模板引擎功能示例
Sep 02 Python
Python语言描述KNN算法与Kd树
Dec 13 Python
python 接口测试response返回数据对比的方法
Feb 11 Python
win7 x64系统中安装Scrapy的方法
Nov 18 Python
python实现逆滤波与维纳滤波示例
Feb 26 Python
Keras使用ImageNet上预训练的模型方式
May 23 Python
Python Excel vlookup函数实现过程解析
Jun 22 Python
Python pytesseract验证码识别库用法解析
Jun 29 Python
Python析构函数__del__定义原理解析
Nov 20 Python
python自动化办公操作PPT的实现
Feb 05 Python
Python使用pyecharts控件绘制图表
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强制转换类型及远程管理插件的安全隐患
2014/06/30 PHP
php广告加载类用法实例
2014/09/23 PHP
php面象对象数据库操作类实例
2014/12/02 PHP
基于laravel制作APP接口(API)
2016/03/15 PHP
浅谈PHP中类和对象的相关函数
2017/04/26 PHP
PHP sdk实现在线打包代码示例
2020/12/09 PHP
手把手教你自己写一个js表单验证框架的方法
2010/09/14 Javascript
JavaScript面向对象知识串结(读JavaScript高级程序设计(第三版))
2012/07/17 Javascript
jQuery easyui datagrid动态查询数据实例讲解
2013/02/26 Javascript
JS画线(实例代码)
2013/11/20 Javascript
鼠标拖拽移动子窗体的JS实现
2014/02/25 Javascript
JavaScript设计模式经典之命令模式
2016/02/24 Javascript
原生js仿jquery animate动画效果
2016/07/13 Javascript
Angularjs 实现一个幻灯片示例代码
2016/09/08 Javascript
JS 获取HTML标签内的子节点的方法
2016/09/21 Javascript
JavaScript编程设计模式之观察者模式(Observer Pattern)实例详解
2017/10/25 Javascript
Layui tree 下拉菜单树的实例代码
2019/09/21 Javascript
vue-cli单页面预渲染seo-prerender-spa-plugin操作
2020/08/10 Javascript
[05:09]DOTA2-DPC中国联赛2月22日Recap集锦
2021/03/11 DOTA
python实现爬虫统计学校BBS男女比例之数据处理(三)
2015/12/31 Python
使用Python读写文本文件及编写简单的文本编辑器
2016/03/11 Python
Python将一个CSV文件里的数据追加到另一个CSV文件的方法
2018/07/04 Python
python3爬取torrent种子链接实例
2020/01/16 Python
TensorFlow获取加载模型中的全部张量名称代码
2020/02/11 Python
python实现飞机大战项目
2020/03/11 Python
浅谈keras中Dropout在预测过程中是否仍要起作用
2020/07/09 Python
Python中使用Selenium环境安装的方法步骤
2021/02/22 Python
嘻哈珠宝品牌:KRKC&CO
2020/10/19 全球购物
介绍一下grep命令的使用
2015/06/12 面试题
大二自我鉴定
2014/01/31 职场文书
小学新教师培训方案
2014/02/03 职场文书
公司承诺书怎么写
2014/05/24 职场文书
汽车4S店前台接待岗位职责
2015/04/03 职场文书
如果用一句诗总结你的上半年,你会用哪句呢?
2019/07/16 职场文书
CentOS7安装GlusterFS集群以及相关配置
2022/04/12 Servers
Android基础入门之dataBinding的简单使用教程
2022/06/21 Java/Android