Loading... 最近在研究 python 爬虫的时候遇到一点小困难,磨了我许久,查阅各种资料,总算解决了。 在这里把相关的内容分享给大家。 **问题是这样的:** python 的中文乱码问题每次总是困扰我许久,真的是很让人吐血的问题,特别你用的如果是 2.7 版本的 python 的话(我这儿必须用这个,所以拿这个为案例)。 使用 python 的第三方包,requests 包来进行网页访问获取网页源码的时候(这个包是一个比 urllib2 包好许多的包,使用的是全新的 urllib3 来整合的,简单易用。**顺便提一句,如果学过我的易语言 post 课程的同学,应该对于这个包的使用思想不会太陌生。** 如果大家感兴趣的话,也可以去查看一下这个包的官方英文使用文档:[http://docs.python-requests.org/en/master/user/quickstart/#make-a-request](http://docs.python-requests.org/en/master/user/quickstart/#make-a-request)),我发现,有的网站可以通过它内置的编码转换的方法(内置的很强大,通常都能自动解析)正常转换看到中文,并且大多数网站如此。 但当我使用咱们雪山凌狐教程的官网做测试的时候,发现总是给我报错,遍寻网络很难找到精准的解决方案。 最后经过多方尝试,还是通过某种写法成功的解决了中文乱码显示的问题,在这里咱好好记录一下实现的过程。 **运行信息:** python 版本:2.7.13 32 位 电脑版本:win10 64 位 **必要包的安装:** 如果需要自己安装 requests 包,请在 cmd 中运行如下命令: ```bash pip install requests ``` 即可自动安装这个包,之后的脚本中引入这个包即可。 **requests 包基本使用方法科普:** 既然教学,咱就让大家一站式学习这个包的基础使用方法。 当我们需要获取展示某个网站的源码的时候,我们可以这样写脚本: ```python # -*- coding:utf-8 -*- import sys reload(sys) sys.setdefaultencoding("utf-8") import requests as rq url = 'http://fox-9.com' r = rq.get(url) ``` 其中 get 方法可以传入要访问的网址参数,返回的 `r` 就是一个 request 对象,它可以实现许多属性的调用。 比如我们在上面代码的基础上,写如下代码: ```python print r print r.encoding print r.content ``` 其中第一个可以返回 `r` 这个对象的信息,`r.encoding` 可以返回目前这个包默认会解析给网页的编码方式,而 `r.content` 可以返回 unicode 编码方式的返回文本。 本例如果你这么写的话你会发现 `r.content` 返回的源码中,中文汉字的部分是乱码的展现方式,这是我一开始最纠结的地方。 另外,你还可以这么写: ```python print r.text ``` 这里返回的是返回内容的文本方式,会按照指定的编码进行解码和展示。 好的,补充知识小课堂就到这里。 **研究过程:** 这里咱们承接一下之前讲的基础小知识内容,那我想获取雪山凌狐教程官网页面的源码时,我一开始是这么写的: ```python # -*- coding:utf-8 -*- import sys reload(sys) sys.setdefaultencoding("utf-8") import requests as rq url = 'http://fox-9.com' r = rq.get(url) r.encoding = 'utf-8' print r.text ``` 这时候我发现运行脚本的结果是这样子的: ```bash 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 数据库中。 既然是空白字符,那我要他有何用。要如何去掉它呢? 网上通常的建议做法是这样的: ```bash >>> s 'T-shirt\xa0\xa0短袖圆领衫,体恤衫\xa0' >>> out = "".join(s.split()) >>> out 'T-shirt短袖圆领衫,体恤衫' ``` 按照这个思路,我进行了尝试。发现出来的结果真的可以看到中文汉字了诶!!! 但是不要高兴得太早,我发现这样写了之后,网页返回的源码的换行部分全部都被删去了,好像连普通的空格也不见了(这一点记不清)。 于是我思考能不能用 replace 方法将内容中的这个字符单独替换成我们平常普通的空格呢?进行了一定的尝试,我发现成功了。 这么写: ```python # -*- coding:utf-8 -*- import sys reload(sys) sys.setdefaultencoding("utf-8") import requests as rq url = 'http://fox-9.com' r = rq.get(url) r.encoding = 'utf-8' s = r.text.replace(u'\xa0',u' ') print s ``` 这里需要注意的一点是,进行 replace 的是 `r.text`,而不是 `r.content`,结果如此,大家记住就好了。 如此终于可以正常显示咱们官网的网页源码了!!!! 希望大家遇到相似的其他问题的时候也可以从这里举一反三得到答案。 感谢大家的收看,我们下期再见! 最后修改:2021 年 08 月 15 日 © 允许规范转载 赞 赠人玫瑰,手留余香