浅谈Python爬取网页的编码处理


Posted in Python onNovember 04, 2016

背景

中秋的时候,一个朋友给我发了一封邮件,说他在爬链家的时候,发现网页返回的代码都是乱码,让我帮他参谋参谋(中秋加班,真是敬业= =!),其实这个问题我很早就遇到过,之前在爬小说的时候稍微看了一下,不过没当回事,其实这个问题就是对编码的理解不到位导致的。

问题

很普通的一个爬虫代码,代码是这样的:

# ecoding=utf-8
import re
import requests
import sys
reload(sys)
sys.setdefaultencoding('utf8')

url = 'http://3water.com/ershoufang/rs%E6%8B%9B%E5%95%86%E6%9E%9C%E5%B2%AD/'
res = requests.get(url)
print res.text

目的其实很简单,就是爬一下链家的内容,但是这样执行之后,返回的结果,所有涉及到中文的内容,全部会变成乱码,比如这样

浅谈Python爬取网页的编码处理

<script type="text/template" id="newAddHouseTpl">
 <div class="newAddHouse">
  自从您上次浏览(<%=time%>)之后,该搜索条件下æ?°å¢žåŠ 了<%=count%>套房源
  <a href="<%=url%>" class="LOGNEWERSHOUFANGSHOW" <%=logText%>><%=linkText%></a>
  <span class="newHouseRightClose">x</span>
 </div>
</script>

这样的数据拿来可以说毫无作用。

问题分析

这里的问题很明显了,就是文字的编码不正确,导致了乱码。

查看网页的编码

从爬取的目标网页的头来看,网页是用utf-8来编码的。

<meta http-equiv="Content-Type" content="text/html; charset=utf-8">

所以,最终的编码,我们肯定也要用utf-8来处理,也就是说,最终的文本处理,要用utf-8来解码,也就是:decode('utf-8')

文本的编码解码

Python的编码解码的过程是这样的,源文件 ===》 encode(编码方式) ===》decode(解码方式),在很大的程度上,不推荐使用

import sys
reload(sys)
sys.setdefaultencoding('utf8')

这种方式来硬处理文字编码。不过在某些时候不影响的情况下,偷偷懒也不是什么大问题,不过比较建议的就是获取源文件之后,使用encode和decode的方式来处理文本。

回到问题

现在问题最大的是源文件的编码方式,我们正常使用requests的时候,它会自动猜源文件的编码方式,然后转码成Unicode的编码,但是,毕竟是程序,是有可能猜错的,所以如果猜错了,我们就需要手工来指定编码方式。官方文档的描述如下:

When you make a request, Requests makes educated guesses about the encoding of the response based on the HTTP headers. The text encoding guessed by Requests is used when you access r.text. You can find out what encoding Requests is using, and change it, using the r.encoding property.

所以我们需要查看requests返回的编码方式到底是什么?

# ecoding=utf-8
import re
import requests
from bs4 import BeautifulSoup
import sys
reload(sys)
sys.setdefaultencoding('utf8')

url = 'http://3water.com/ershoufang/rs%E6%8B%9B%E5%95%86%E6%9E%9C%E5%B2%AD/'

res = requests.get(url)
print res.encoding

打印的结果如下:

ISO-8859-1

也就是说,源文件使用的是ISO-8859-1来编码。百度一下ISO-8859-1,结果如下:

ISO8859-1,通常叫做Latin-1。Latin-1包括了书写所有西方欧洲语言不可缺少的附加字符。

问题解决

发现了这个东东,问题就很好解决了,只要指定一下编码,就能正确的打出中文了。代码如下:

# ecoding=utf-8
import requests
import sys
reload(sys)
sys.setdefaultencoding('utf8')

url = 'http://3water.com/ershoufang/rs%E6%8B%9B%E5%95%86%E6%9E%9C%E5%B2%AD/'

res = requests.get(url)
res.encoding = ('utf8')

print res.text

打印的结果就很明显,中文都正确的显示出来了。

浅谈Python爬取网页的编码处理

另一种方式是在源文件上做解码和编码,代码如下:

# ecoding=utf-8
import requests
import sys
reload(sys)
sys.setdefaultencoding('utf8')

url = 'http://3water.com/ershoufang/rs%E6%8B%9B%E5%95%86%E6%9E%9C%E5%B2%AD/'

res = requests.get(url)
# res.encoding = ('utf8')

print res.text.encode('ISO-8859-1').decode('utf-8')

另:ISO-8859-1也叫做latin1,使用latin1做解码结果也是正常的。

关于字符的编码,很多东西可以说,想了解的朋友可以参考以下大神的资料。

•《The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)》

以上这篇浅谈Python爬取网页的编码处理就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python中字典(dict)合并的四种方法总结
Aug 10 Python
神经网络理论基础及Python实现详解
Dec 15 Python
Python使用numpy产生正态分布随机数的向量或矩阵操作示例
Aug 22 Python
python mysql断开重连的实现方法
Jul 26 Python
Python 3 判断2个字典相同
Aug 06 Python
python 消费 kafka 数据教程
Dec 21 Python
Win下PyInstaller 安装和使用教程
Dec 25 Python
pytorch .detach() .detach_() 和 .data用于切断反向传播的实现
Dec 27 Python
Python实现清理微信僵尸粉功能示例【基于itchat模块】
May 29 Python
python opencv实现直线检测并测出倾斜角度(附源码+注释)
Dec 31 Python
用python-webdriver实现自动填表的示例代码
Jan 13 Python
解析目标检测之IoU
Jun 26 Python
Django接受前端数据的几种方法总结
Nov 04 #Python
Python多维/嵌套字典数据无限遍历的实现
Nov 04 #Python
浅谈Python数据类型判断及列表脚本操作
Nov 04 #Python
浅谈python字典多键值及重复键值的使用
Nov 04 #Python
用Python将动态GIF图片倒放播放的方法
Nov 02 #Python
各种Python库安装包下载地址与安装过程详细介绍(Windows版)
Nov 02 #Python
Python实现简单的四则运算计算器
Nov 02 #Python
You might like
这部好评如潮的动漫 知名梗频出 但是画风劝退很多人
2020/03/08 日漫
逆序二维数组插入一元素的php代码
2012/06/08 PHP
PHP实现二维数组中的查找算法小结
2018/06/09 PHP
php实现有序数组旋转后寻找最小值方法
2018/09/27 PHP
基于jquery实现的服务器验证控件的启用和禁用代码
2010/04/27 Javascript
Jquery EasyUI中弹出确认对话框以及加载效果示例代码
2014/02/13 Javascript
JS实现文档加载完成后执行代码
2015/07/09 Javascript
jquery实现ajax加载超时提示的方法
2016/07/23 Javascript
基于Vuejs框架实现翻页组件
2020/06/29 Javascript
JavaScript实现的可变动态数字键盘控件方式实例代码
2017/07/15 Javascript
你点的 ES6一些小技巧,请查收
2018/04/25 Javascript
详解Vue组件插槽的使用以及调用组件内的方法
2018/11/13 Javascript
vscode 调试 node.js的方法步骤
2020/09/15 Javascript
vue实现简易计算器功能
2021/01/20 Vue.js
[05:59]2018DOTA2国际邀请赛寻真——只为胜利的Secret
2018/08/13 DOTA
[20:30]职业巡回赛回顾
2018/08/09 DOTA
Python中shutil模块的学习笔记教程
2017/04/04 Python
Python3中列表list合并的四种方法
2019/04/19 Python
python flask解析json数据不完整的解决方法
2019/05/26 Python
vscode写python时的代码错误提醒和自动格式化的方法
2020/05/07 Python
浅谈Python程序的错误:变量未定义
2020/06/02 Python
python 元组的使用方法
2020/06/09 Python
详解Open Folder as PyCharm Project怎么添加的方法
2020/12/29 Python
以下的初始化有什么区别
2013/12/16 面试题
如何定义一个可复用的服务
2014/09/30 面试题
内科护士实习自我鉴定
2013/10/17 职场文书
应届毕业生求职自荐书
2014/01/03 职场文书
出租房屋协议书
2014/09/14 职场文书
2014幼儿园卫生保健工作总结
2014/12/05 职场文书
晚会闭幕词
2015/01/28 职场文书
初中政治教学工作总结
2015/08/13 职场文书
小学生作文写作技巧100例,非常实用!
2019/07/08 职场文书
php访问对象中的成员的实例方法
2021/11/17 PHP
Nginx 反向代理解决跨域问题多种情况分析
2022/01/18 Servers
python如何为list实现find方法
2022/05/30 Python
windows10 家庭版下FTP服务器搭建教程
2022/08/05 Servers