内容简介:在用 python2 抓取网页的时候,经常会遇到抓下来的内容显示出来是乱码。发生这种情况的最大可能性就是编码问题:比如,在 windows 的控制台(gbk)里抓取了一个 utf-8 编码的网站。或者,在 Mac / Linux 的终端(utf-8)里抓取了一个 gbk 编码的网站。因为多数网站采用 utf-8 编码,而不少人又是用 windows,所有这种情况相当常见。
在用 python 2 抓取网页的时候,经常会遇到抓下来的内容显示出来是乱码。
发生这种情况的最大可能性就是编码问题: 运行环境的字符编码和网页的字符编码不一致。
比如,在 windows 的控制台(gbk)里抓取了一个 utf-8 编码的网站。或者,在 Mac / Linux 的终端(utf-8)里抓取了一个 gbk 编码的网站。因为多数网站采用 utf-8 编码,而不少人又是用 windows,所有这种情况相当常见。
如果你发现你抓下来的内容,看上去英文、数字、符号都是对的,但中间夹杂了一些乱码,那基本可以断定是此情况。
解决这个问题的办法就是,把结果先按网页的编码方式 decode 解码成 unicode,再输出。如果不确定网页的编码,可参照以下代码:
import urllib req = urllib.urlopen("http://some.web.site") info = req.info() charset = info.getparam('charset') content = req.read() print content.decode(charset, 'ignore') 复制代码
'ignore' 参数的作用是忽略掉无法解码的字符。
不过这种方法不总是有效。还有种方式就是通过正则直接匹配网页代码中的编码设置:
<meta http-equiv=Content-Type content="text/html;charset=utf-8"> 复制代码
除了编码问题造成乱码之外,还有种常被忽视的情况,就是 目标网页启用了 gzip 压缩 。压缩后的网页传输数据少了,打开速度更快。在浏览器中打开时,浏览器会根据网页的 header 信息自动做解压。但直接用代码抓取则不会。因此很可能就被搞糊涂了,为什么明明打开网页地址是对的,但程序抓取就不行。连我自己也曾经被这个问题坑过。
这种情况的表现是抓取的内容几乎全是乱码,甚至无法显示。
要判断网页是否启用了压缩并对其解压,可参考以下代码:
import urllib import gzip from StringIO import StringIO req = urllib.urlopen("http://some.web.site") info = req.info() encoding = info.getheader('Content-Encoding') content = req.read() if encoding == 'gzip': buf = StringIO(content) gf = gzip.GzipFile(fileobj=buf) content = gf.read() print content 复制代码
在我们教室的编程实例查天气系列(点击查看) 中,这两个问题困扰了相当多人。在此特别讲解一下。
最后,还有个“利器”要介绍一下。如果一开始就用它,你甚至不知道还有上述两个问题的存在。
这就是 requests 模块。
同样抓取网页,只需要:
import requests print requests.get("http://some.web.site").text 复制代码
没有编码问题,没有压缩问题。
This is why I love Python.
至于如何安装 requests 模块,请参考之前的文章:
如何安装 Python 的第三方模块 - Crossin的编程教室 - 知乎专栏
pip install requests 复制代码
其他文章及回答:
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- 生产系统 SQL 执行异常原因分析
- go http 框架性能大幅下降原因分析
- ajax获取json数据为undefined原因分析
- Flex读取txt文件中的内容报错原因分析及解决
- 使用Java sound播放音频文件出现“文件类型不支持”报错的原因分析
- RocketMQ 消息发送 system busy、broker busy 原因分析与解决方案
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Python 3学习笔记(上卷)
雨痕 / 电子工业出版社 / 2018-1 / 89
经过9 年的发展,Python 3 生态已相当成熟。无论是语言进化、解释器性能提升,还是第三方支持,都是如此。随着Python 2.7 EOF 日趋临近,迁移到Python 3 的各种障碍也被逐一剔除。是时候在新环境下学习或工作了。 人们常说Python 简单易学,但这是以封装和隐藏复杂体系为代价的。仅阅读语言规范很难深入,亦无从发挥其应有能力,易学难精才是常态。《Python 3学习笔记(......一起来看看 《Python 3学习笔记(上卷)》 这本书的介绍吧!