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实现绘制树枝简单示例
Jul 24 Python
Python命令行参数解析模块optparse使用实例
Apr 13 Python
Python新手们容易犯的几个错误总结
Apr 01 Python
Python面向对象之静态属性、类方法与静态方法分析
Aug 24 Python
python调用百度REST API实现语音识别
Aug 30 Python
python读取csv和txt数据转换成向量的实例
Feb 12 Python
使用Python自动化破解自定义字体混淆信息的方法实例
Feb 13 Python
Pandas之groupby( )用法笔记小结
Jul 23 Python
python实现统计代码行数的小工具
Sep 19 Python
python实现一个猜拳游戏
Apr 05 Python
python接入支付宝的实例操作
Jul 20 Python
分享3个非常实用的 Python 模块
Mar 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
PHP分页函数代码(简单实用型)
2010/12/02 PHP
PHP日期处理函数 整型日期格式
2011/01/12 PHP
支付宝接口开发集成支付环境小结
2015/03/17 PHP
PHP与JavaScript针对Cookie的读写、交互操作方法详解
2017/08/07 PHP
php格式文件打开的四种方法
2018/02/24 PHP
PHP cURL获取微信公众号access_token的实例
2018/04/28 PHP
PhpStorm本地断点调试的方法步骤
2018/05/21 PHP
javascript 动态table添加colspan\rowspan 参数的方法
2009/07/25 Javascript
zeroclipboard 单个复制按钮和多个复制按钮的实现方法
2014/06/14 Javascript
JavaScript中的函数嵌套使用
2015/06/04 Javascript
BootstrapTable refresh 方法使用实例简单介绍
2017/02/20 Javascript
hammer.js实现图片手势放大效果
2017/08/29 Javascript
VUE实现密码验证与提示功能
2019/10/18 Javascript
react-native聊天室|RN版聊天App仿微信实例|RN仿微信界面
2019/11/12 Javascript
TypeScript魔法堂之枚举的超实用手册
2020/10/29 Javascript
Python中用sleep()方法操作时间的教程
2015/05/22 Python
深入解析Python设计模式编程中建造者模式的使用
2016/03/02 Python
Python制作刷网页流量工具
2017/04/23 Python
TensorFlow入门使用 tf.train.Saver()保存模型
2018/04/24 Python
Python同步遍历多个列表的示例
2019/02/19 Python
Python利用字典破解WIFI密码的方法
2019/02/27 Python
python儿童学游戏编程知识点总结
2019/06/03 Python
解决Alexnet训练模型在每个epoch中准确率和loss都会一升一降问题
2020/06/17 Python
Python request post上传文件常见要点
2020/11/20 Python
绝对令人的惊叹的CSS3折叠效果(3D效果)整理
2012/12/30 HTML / CSS
美国非常受欢迎的Spa品牌:Bliss必列斯
2018/04/10 全球购物
可口可乐广告词
2014/03/20 职场文书
开学典礼演讲稿
2014/05/23 职场文书
会计专业应届生自荐信
2014/06/28 职场文书
部队反四风对照检查材料
2014/09/26 职场文书
离婚协议书怎么写2014
2014/09/30 职场文书
党的群众路线教育实践活动整改方案
2014/10/28 职场文书
青年岗位能手事迹材料
2014/12/23 职场文书
刑事申诉状范文
2015/05/20 职场文书
社区安全温馨提示语
2015/07/14 职场文书
VS2019连接MySQL数据库的过程及常见问题总结
2021/11/27 MySQL