终极VIP火热报名中!欲入从速~fiddler5.0汉化绿色版雪山凌狐教程专版共享中,请在官网搜索“fiddler5.0汉化绿色版”!

python的requests包出现的因u’\xa0’的中文乱码问题

python相关 雪山凌狐 52℃

最近在研究python爬虫的时候遇到一点小困难,磨了我许久,查阅各种资料,总算解决了。

在这里把相关的内容分享给大家。

 

问题是这样的:

python的中文乱码问题每次总是困扰我许久,真的是很让人吐血的问题,特别你用的如果是2.7版本的python的话(我这儿必须用这个,所以拿这个为案例)。

使用python的第三方包,requests包来进行网页访问获取网页源码的时候(这个包是一个比urllib2包好许多的包,使用的是全新的urllib3来整合的,简单易用。顺便提一句,如果学过我的易语言post课程的同学,应该对于这个包的使用思想不会太陌生。如果大家感兴趣的话,也可以去查看一下这个包的官方英文使用文档:http://docs.python-requests.org/en/master/user/quickstart/#make-a-request),我发现,有的网站可以通过它内置的编码转换的方法(内置的很强大,通常都能自动解析)正常转换看到中文,并且大多数网站如此。

但当我使用咱们雪山凌狐教程的官网做测试的时候,发现总是给我报错,遍寻网络很难找到精准的解决方案。

最后经过多方尝试,还是通过某种写法成功的解决了中文乱码显示的问题,在这里咱好好记录一下实现的过程。

 

运行信息:

python版本:2.7.13  32位

电脑版本:win10 64位

 

必要包的安装:

如果需要自己安装requests包,请在cmd中运行如下命令:

pip install requests

即可自动安装这个包,之后的脚本中引入这个包即可。

 

requests包基本使用方法科普:

既然教学,咱就让大家一站式学习这个包的基础使用方法。

当我们需要获取展示某个网站的源码的时候,我们可以这样写脚本:

# -*- coding:utf-8 -*-

import sys
reload(sys)
sys.setdefaultencoding("utf-8")

import requests as rq

url = 'https://www.xueshanlinghu.com'
r = rq.get(url)

其中get方法可以传入要访问的网址参数,返回的r就是一个request对象,它可以实现许多属性的调用。

比如我们在上面代码的基础上,写如下代码:

print r
print r.encoding
print r.content

其中第一个可以返回r这个对象的信息,r.encoding可以返回目前这个包默认会解析给网页的编码方式,而r.content可以返回unicode编码方式的返回文本。

本例如果你这么写的话你会发现r.content返回的源码中,中文汉字的部分是乱码的展现方式,这是我一开始最纠结的地方。

另外,你还可以这么写:

print r.text

这里返回的是返回内容的文本方式,会按照指定的编码进行解码和展示。

好的,补充知识小课堂就到这里。

 

研究过程:

这里咱们承接一下之前讲的基础小知识内容,那我想获取雪山凌狐教程官网页面的源码时,我一开始是这么写的:

# -*- coding:utf-8 -*-

import sys
reload(sys)
sys.setdefaultencoding("utf-8")

import requests as rq

url = 'https://www.xueshanlinghu.com'
r = rq.get(url)
r.encoding = 'utf-8'

print r.text

这时候我发现运行脚本的结果是这样子的:

Traceback (most recent call last):
File "presentation.py", line 13, in <module>
print r.text
UnicodeEncodeError: 'gbk' codec can't encode character u'\xa0' in position 29439: illegal multibyte sequence

天呐,这么还出错了呢?

那中间的错误尝试咱就不多讲了,这里直接上正确的这个问题的解决方案。

……(这里省略一万种错误尝试)

好了,这时候我灵光一闪,既然一直给我提示说这个unicode字符无法编码,那我挺好奇这个字符到底是干什么的。

于是我在网上查了一下“u’\xa0’”这个东西,发现是这么解释的:

\xa0 是不间断空白符

我们通常所用的空格是 \x20 ,是在标准ASCII可见字符 0x20~0x7e 范围内。
而 \xa0 属于 latin1 (ISO/IEC_8859-1)中的扩展字符集字符,代表空白符nbsp(non-breaking space)。
latin1 字符集向下兼容 ASCII ( 0x20~0x7e )。通常我们见到的字符多数是 latin1 的,比如在 MySQL 数据库中。

既然是空白字符,那我要他有何用。要如何去掉它呢?

网上通常的建议做法是这样的:

>>> s
'T-shirt\xa0\xa0短袖圆领衫,体恤衫\xa0'
>>> out = "".join(s.split())
>>> out
'T-shirt短袖圆领衫,体恤衫'

按照这个思路,我进行了尝试。发现出来的结果真的可以看到中文汉字了诶!!!

但是不要高兴得太早,我发现这样写了之后,网页返回的源码的换行部分全部都被删去了,好像连普通的空格也不见了(这一点记不清)。

于是我思考能不能用replace方法将内容中的这个字符单独替换成我们平常普通的空格呢?进行了一定的尝试,我发现成功了。

这么写:

# -*- coding:utf-8 -*-

import sys
reload(sys)
sys.setdefaultencoding("utf-8")

import requests as rq

url = 'https://www.xueshanlinghu.com'
r = rq.get(url)
r.encoding = 'utf-8'

s = r.text.replace(u'\xa0',u' ')
print s

这里需要注意的一点是,进行replace的是r.text,而不是r.content,结果如此,大家记住就好了。

 

如此终于可以正常显示咱们官网的网页源码了!!!!

 

希望大家遇到相似的其他问题的时候也可以从这里举一反三得到答案。

 

感谢大家的收看,我们下期再见!

转载请注明:雪山凌狐教程 » python的requests包出现的因u’\xa0’的中文乱码问题

喜欢 (0)or分享 (0)