python2利用urllib2抓取中文网页乱码的问题
2017-11-02 22:33
721 查看
话说晚上上完爬虫抓取班会之后群里有童鞋扔出来了一个网址www.runoob.com/python/python-exercise-example1.html 并且疑问说这个地址用urllib2抓出来的居然是乱码希望大家一起看看。本着上山打老虎的精神我先是不信邪的写了一下代码重新运行了一下然后出来一大群这种东西。
【代码1】import urllib2ur1='http://www.runoob.com/python/python-exercise-example1.html'reponse=urllib2.urlopen(ur1)r=reponse.read()print r【运行结果1】
瞬间感觉有一种扯淡的感觉。不过作为一个白条码农虽然可能没有“愚公移山”找bug的精神但不找一找总感觉有点不太对所以根据仅有的一点知识就开始进行尝试开始认为是编码问题而且一般来讲很大可能也是编码问题就先试着转了一下码。因为网页是utf8编码不知道如何查看网页编码的同学请找度娘询问一下所以就想着转码一下估计就可以了于是就利用了decode转码先尝试一下。
为小白着想解释一下decode:decode的作用是将其他编码的字符串转换成unicode编码如str1.decode('gb2312')表示将gb2312编码的字符串str1转换成unicode编码。【代码2】import urllib2ur1='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 requestsr=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 gzipimport StringIOimport 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.htmlps感谢张锦添同学提出的问题及最后找到的技巧总结
【代码1】import urllib2ur1='http://www.runoob.com/python/python-exercise-example1.html'reponse=urllib2.urlopen(ur1)r=reponse.read()print r【运行结果1】
瞬间感觉有一种扯淡的感觉。不过作为一个白条码农虽然可能没有“愚公移山”找bug的精神但不找一找总感觉有点不太对所以根据仅有的一点知识就开始进行尝试开始认为是编码问题而且一般来讲很大可能也是编码问题就先试着转了一下码。因为网页是utf8编码不知道如何查看网页编码的同学请找度娘询问一下所以就想着转码一下估计就可以了于是就利用了decode转码先尝试一下。
为小白着想解释一下decode:decode的作用是将其他编码的字符串转换成unicode编码如str1.decode('gb2312')表示将gb2312编码的字符串str1转换成unicode编码。【代码2】import urllib2ur1='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 requestsr=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 gzipimport StringIOimport 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.htmlps感谢张锦添同学提出的问题及最后找到的技巧总结
相关文章推荐
- python2利用urllib2抓取中文网页乱码的问题
- Python利用urllib2抓取网页返回乱码的问题
- python2利用urllib2抓取中文网页乱码的问题
- python 解决抓取网页中的中文显示乱码问题
- Python+Requests安装及抓取网页源码中文乱码问题的解决
- python 解决抓取网页中的中文显示乱码问题
- python抓取中文网页显示乱码问题
- python 网页抓取中的中文乱码问题解决
- 利用python3的urllib.request抓取网页内容并显示中文
- Python爬虫处理抓取数据中文乱码问题
- PHP中使用file_get_contents抓取网页中文乱码问题解决方法
- 【python】网页内容抓取遭遇乱码问题
- PHP中使用file_get_contents抓取网页中文乱码问题解决方法
- 黄聪:python访问抓取网页常用命令(保存图片到本地、模拟POST、GET、中文编码问题)
- 解决Python网页爬虫之中文乱码问题
- 黄聪:python访问抓取网页常用命令(保存图片到本地、模拟POST、GET、中文编码问题)
- python抓取中文网页乱码
- python第一个爬虫小程序以及遇到问题解决(中文乱码)+批量爬取网页并保存至本地
- Python爬网页,中文输出乱码问题
- Python 中利用urllib2简单实现网页抓取