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抓取网页图片示例(python爬虫)
Apr 27 Python
详解Python中的多线程编程
Apr 09 Python
在Django的模型和公用函数中使用惰性翻译对象
Jul 27 Python
利用Python将时间或时间间隔转为ISO 8601格式方法示例
Sep 05 Python
python 通过字符串调用对象属性或方法的实例讲解
Apr 21 Python
python 反向输出字符串的方法
Jul 16 Python
numpy添加新的维度:newaxis的方法
Aug 02 Python
Python爬虫框架scrapy实现downloader_middleware设置proxy代理功能示例
Aug 04 Python
Django实现网页分页功能
Oct 31 Python
Python: tkinter窗口屏幕居中,设置窗口最大,最小尺寸实例
Mar 04 Python
安装pyinstaller遇到的各种问题(小结)
Nov 20 Python
Python人工智能之混合高斯模型运动目标检测详解分析
Nov 07 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
Linux Apache PHP Oracle 安装配置(具体操作步骤)
2013/06/17 PHP
phpcms中的评论样式修改方法
2016/10/21 PHP
Google Map Api和GOOGLE Search Api整合实现代码
2009/07/18 Javascript
关于IE浏览器以及Firefox下的javascript冒泡事件的响应层级
2010/10/14 Javascript
30个最佳jQuery Lightbox效果插件分享
2011/04/11 Javascript
javascript 原型继承介绍
2011/08/30 Javascript
关于js new Date() 出现NaN 的分析
2012/10/23 Javascript
JS+CSS实现Li列表隔行换色效果的方法
2015/02/16 Javascript
使用impress.js制作幻灯片
2015/09/09 Javascript
跟我学习JScript的Bug与内存管理
2015/11/18 Javascript
一次记住JavaScript的6个正则表达式方法
2018/02/22 Javascript
React性能优化系列之减少props改变的实现方法
2019/01/17 Javascript
通过JS深度判断两个对象字段相同
2019/06/14 Javascript
IE11下CKEditor在Bootstrap Modal中下拉问题的解决
2019/09/25 Javascript
three.js利用射线Raycaster进行碰撞检测
2020/03/12 Javascript
vue项目或网页上实现文字转换成语音播放功能
2020/06/09 Javascript
基于小程序请求接口wx.request封装的类axios请求
2020/07/02 Javascript
Python基础教程之利用期物处理并发
2018/03/29 Python
pandas表连接 索引上的合并方法
2018/06/08 Python
mac安装pytorch及系统的numpy更新方法
2018/07/26 Python
基于pycharm导入模块显示不存在的解决方法
2018/10/13 Python
python 进程间数据共享multiProcess.Manger实现解析
2019/09/23 Python
Python日志:自定义输出字段 json格式输出方式
2020/04/27 Python
Python调用百度OCR实现图片文字识别的示例代码
2020/07/17 Python
详解tf.device()指定tensorflow运行的GPU或CPU设备实现
2021/02/20 Python
英国皇室御用百货:福南梅森(Fortnum & Mason)
2017/12/03 全球购物
美国马匹用品和骑马配件购物网站:Horse.com
2018/01/08 全球购物
大学毕业登记表自我鉴定
2013/10/09 职场文书
大学四年学习的自我评价分享
2013/12/09 职场文书
高中毕业生自我鉴定例文
2013/12/29 职场文书
小学教师国培感言
2014/02/08 职场文书
《母鸡》教学反思
2014/02/25 职场文书
《奇妙的国际互联网》 教学反思
2014/02/25 职场文书
《她是我的朋友》教学反思
2014/04/26 职场文书
人为什么会“幸灾乐祸”?
2019/08/06 职场文书
react使用antd的上传组件实现文件表单一起提交功能(完整代码)
2021/06/29 Javascript