错误: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