在用 python2 抓取网页的时刻,经常会碰到抓下来的内容显现出来是乱码。
发作这类状况的最大可能性就是编码题目: 运转环境的字符编码和网页的字符编码不一致。
比方,在 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
以上就是Python抓取网页乱码的缘由及处理要领的细致内容,更多请关注ki4网别的相干文章!