python2利用urllib2抓取中文网页乱码的问题

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

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

    而且疑问说这个地址用urllib2抓出来的竟然是乱码但愿你们一块儿看看。本着上山打老虎的精神我先是不信邪的写了一下代码从新运行了一下而后出来一大群这种东西。
python爬虫

【代码1】ide

import urllib2网站

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

reponse=urllib2.urlopen(ur1)编码

r=reponse.read()url

print rspa

【运行结果1】code

小白问题集python2利用urllib2抓取中文网页乱码的问题.png



    瞬间感受有一种扯淡的感受。不过做为一个白条码农虽然可能没有“愚公移山”找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感谢张锦添同窗提出的问题及最后找到的技巧总结

相关文章
相关标签/搜索