AttributeError: 'str' object has no attribute 'decode'

错误:AttributeError: ‘str’ object has no attribute ‘decode’

错误:在scrapy爬虫数据 中解码数据时

str1="\u7684\u540d\u8bcd"  
#unicode编码
print(type(str1))
print(type(str1.encode()))
print(str1.decode("unicode_escape"))

#(输出)
 <class 'str'>
 <class 'bytes'>
AttributeError: 'str' object has no attribute 'decode

解决后

str1="\u7684\u540d\u8bcd"
#unicode编码
print(type(str1))
print(type(str1.encode()))
print(str1.encode("unicode_escape").decode("unicode_escape"))

#(输出)
<class 'str'>
<class 'bytes'>
的名词

解释如下:

编码和解码

从本质上来说,编码和解码就是Python中str和bytes这两种字符串类型之间的互相转换。, str包含一个encode方法,使用特定编码将该字符串其转换为一个bytes,这称之为编码。 bytes类包含了一个decode方法,也接受一个编码作为单个必要参数,并返回一个str,这称之为解码。这种转换操作是显式的操作,且必须根据数据被编码时采用的编码类型进行解码。

python3似乎对一切的unicode都那么的友好,当一个字符串里存在unicode的时候,只要字符串是硬编码的,就可以转换成中文打印在控制台上,但是,假如你。。的这段含有‘\u’的unicode编码不是硬编码进脚本的,而是通过requests在网上爬的。。。那么你会发现,你打印出来的,还是长这样的unicode编码,换句话说,解释器这个时候根本就没认出这东西原来是unicode编码,当成普通的字符序列了。

Python 3.X带有3种字符串对象类型——一种用于文本数据,两种用于二进制数据:
str表示Unicode文本(8位的和更宽的)
bytes表示二进制数据
bytearray,是一种可变的bytes类型'''

在使用python3的requests模块时

发现获取响应有两种方式:(r表示response响应内容)
其一,为文本响应内容, r.text
其二,为二进制响应内容,r.content
r.text实际上就是Unicode的响应内容,而r.content是二进制的响应内容,
r.text方法返回的是用unicode编码的响应内容。响应内容的编码取决于HTTP消息头,如果你有HTTP之外的知识来猜测编码,你应该在访问这个属性之前设置合适的r.encoding,也就是说,你可以用r.encoding来改变编码,这样当你访问r.text ,Request 都将会使用r.encoding的新值

当用requests发送一个get请求时,得到的结果如下:

import requests

url = "xxx"
params = "xxx"
cookies = {"xxx": "xxx"}

res = requests.request("get", url, params=params, cookies=cookies)
print(res.text)

那么,\u表示的那一串unicode编码,它是什么原因造成的,请参考知乎相关回答,该如何呈现它的庐山真面目?

print(res.text.encode("unicode_escape").decode("unicode_escape"))

unicode_escape是什么

将unicode的内存编码值进行存储,读取文件时在反向转换回来。这里就采用了unicode-escape的方式

当采用res.content时,也会遇到这个问题:

import requests

url = "xxx"
params = "xxx"
cookies = {"xxx": "xxx"}

res = requests.request("get", url, params=params, cookies=cookies)
print(res.content)

解决的办法就是unicode_escape

print(res.content.decode("unicode_escape"))

总结

str包含一个encode方法,使用特定编码将该字符串其转换为一个bytes,这称之为编码。 bytes类包含了一个decode方法,也接受一个编码作为单个必要参数,并返回一个str,这称之为解码。
str.encode() 把一个字符串转换为其 bytes形式
bytes.decode() 把 bytes转换为其字符串形式

2. 遇到类似的编码问题时,先检查响应内容text是什么类型,
如果type(text) is bytes,那么
text.decode(‘unicode_escape’)

如果type(text) is str,那么
text.encode(‘unicode_escape’).decode(‘unicode_escape’)

参考知乎:https://www.zhihu.com/question/26921730
https://www.cnblogs.com/cnhkzyy/p/9092644.html

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值