python2利用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抓取中文网页乱码的问题.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')

【运行结果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

猜你喜欢

转载自blog.csdn.net/MiaoDaLengShui/article/details/81003315