Open函数保存爬虫结果错误 UnicodeEncodeErro
2018-06-19 本文已影响0人
Jianping_OG
最近在学习网络爬虫,采用Python+Requests+BeautifulSoup+Re框架,遇到的一些问题就记录在这里吧
下面是以“利率”为关键字爬百度并试图保存搜索结果的代码,截取部分:
>> r = requests.get("https://www.baidu.com/s",params={"wd":"利率"},headers=headers)
>> f=open("rate_result.html","w")
>> f.write(r.text)
Traceback (most recent call last):
File "<pyshell#14>", line 1, in <module>
f.write(r.text)
UnicodeEncodeError: 'gbk' codec can't encode character '\xe7' in position 318: illegal multibyte sequence
可见,在写入保存时编码出问题了。那看看源内容是什么编码
>> r.encoding
'utf-8'
这就奇怪了,明明编码是utf-8为什么报错的信息却是gbk呢?——问题出在open函数
以下是解释,想要解决方案可以跳过直接看文章结尾
编码是用来解决字符传输和存储的
理解这一点非常重要。
我们都知道,计算机存储的都是二进制数据,所以编码你可以认为就是一套字符跟二进制数(因为二进制数表示起来位数太长,大多数情况下都用十六进制进行书面表示)的对应关系,比如同样是汉字“我”,在utf-8编码下,计算机会储存成'\xe6\x88\x91';而用gbk编码,则是'\xce\xd2'。由于这种天然的差别,如果字符是utf-8编码的,却想用gbk编码方式进行读取,就肯定会有问题。
open函数处理文本时默认的编码跟平台有关
open函数可接受参数里有一个encoding,具体可查看help(open)
encoding is the name of the encoding used to decode or encode the file.
This should only be used in text mode. The default encoding is platform
dependent, but any encoding supported by Python can be passed.
根据说明,当open函数不指定编码时,处理文本采用的是操作系统默认的编码,在Windows下就是cp936,也就是gbk(cmd下输入命令chcp查看)。
问题出在爬虫结果编码和open编码不一致
看到这里,可能你大概已经知道原因了,我们再来梳理下。
request.get后得到响应对象r,r.text的编码是utf-8,当我们用open函数对r.text进行保存时,由于没有指定编码,所以open函数默认以系统默认gbk编码进行读取保存,bug就这样出现了。
清楚原因,解决起来就容易多了,大概有两个思路:
- 将爬虫结果以二进制形式进行保存,代码如下
>> f=open("rate_result.html","wb")
>> f.write(r.content)
>> f.close()
这时open函数将不会对内容进行编码检查
- 指定open函数编码,代码如下
>> f=open("rate_result.html","w",encoding="utf-8")
>> f.write(r.text)
>> f.close()
版权声明:本文为博主原创文章,未经博主允许不得转载。