话说晚上上完爬虫抓取班会之后群里有童鞋扔出来了一个网址

www.runoob.com/python/python-exercise-example1.html

    并且疑问说这个地址用urllib2抓出来的居然是乱码希望大家一起看看。本着上山打老虎的精神我先是不信邪的写了一下代码重新运行了一下然后出来一大群这种东西。

【代码1】

import urllib2

ur1='http://www.runoob.com/python/python-exercise-example1.html'

reponse=urllib2.urlopen(ur1)

r=reponse.read()

print r

【运行结果1】

python2利用urllib2抓取中文网页乱码的问题_python2.7 网页编码



    瞬间感觉有一种扯淡的感觉。不过作为一个白条码农虽然可能没有“愚公移山”找bug的精神但不找一找总感觉有点不太对所以根据仅有的一点知识就开始进行尝试开始认为是编码问题而且一般来讲很大可能也是编码问题就先试着转了一下码。因为网页是utf8编码不知道如何查看网页编码的同学请找度娘询问一下所以就想着转码一下估计就可以了于是就利用了decode转码先尝试一下。

为小白着想解释一下decode:decode的作用是将其他编码的字符串转换成unicode编码如str1.decode('gb2312')表示将gb2312编码的字符串str1转换成unicode编码。

【代码2】

import urllib2

ur1='http://www.runoob.com/python/python-exercise-example1.html'

reponse=urllib2.urlopen(ur1)

r=reponse.read()

r=r.decode('utf-8')

当我在等着biu一下就好了的时候结果又坑了。

【运行结果2】

UnicodeDecodeError: 'utf8' codec can't decode byte 0x8b in position 1: invalid start byte。


    

    看到这个结果之后我第一个想法是是不是网页内部还存在其他编码不止utf8在个别位置还采用了其他类型的编码。于是又去找了一下度娘根据某些大神的说法一般对于中文网站基本是UTF-8,GB2312,可以GB18030通吃。于是我又把最后 r=r.decode('utf-8')中的编码改成了r=r.decode('GB2312')可是结果还是出现了问题。

【运行结果2-GB2312

UnicodeDecodeError: 'gb2312' codec can't decode bytes in position 1-2: illegal multibyte sequence


    这个时候根据我仅有的一点小白知识发现这个问题貌似我有点不知道该怎么解决了但在这个时候我想还是试试python3吧如果还不行我就缴械投降了。

    于是有用python3的requests模块儿写了一下。

【代码3-python3】

import requests

r=requests.get("http://www.runoob.com/python/python-exercise-example1.html")

print(r.encoding)#打印网页内容编码

print(r.text)#打印网页内容

当我等着报错的时候居然出了结果。

【运行结果3】

utf-8网页编码

<!Doctype html>

<html xmlns=http://www.w3.org/1999/xhtml>

<head>

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

<meta name="viewport" content="width=device-width, initial-scale=1.0" />  

<title>Python 练习实例1 | 菜鸟教程</title>

结果太长只摘取部分内容



    当看到结果我就在想python3可以出来而2出现乱码而且程序报出的编码确实是utf8那会不会是两者对网页的解析不太一样python2缺少了某些步骤或者方法。于是就问了度娘”python2抓取网页乱码问题“这个时候就看到了答案

很多乱码问题是编码造成的但另一个造成乱码的原因是压缩格式很多规模较大的网站都是以gzip的压缩格式输出页面的所以在用BS解析之前需要先判断该网页是否经过压缩如果经过压缩则先进行解压操作。

    

    紧接着下一步就开始尝试解压缩

【代码4】

import gzip

import StringIO

import urllib2


ur1='http://www.runoob.com/python/python-exercise-example1.html'

reponse=urllib2.urlopen(ur1)

r=reponse.read()

data = StringIO.StringIO(r)

gzipper = gzip.GzipFile(fileobj=data)

html = gzipper.read()

print html

解决问题

【运行结果4】

<!Doctype html>

<html xmlns=http://www.w3.org/1999/xhtml>

<head>

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

<meta name="viewport" content="width=device-width, initial-scale=1.0" />  

<title>Python 练习实例1 | 菜鸟教程</title>

结果太长只摘取部分内容


【附1:关于乱码问题简单介绍的网页】

http://www.cnblogs.com/bbcar/p/3625084.html

【附2:用python爬虫抓站的一些技巧总结

http://www.open-open.com/lib/view/open1375945149312.html

ps感谢张锦添同学提出的问题及最后找到的技巧总结