Python3中requests.content调用translate报错TypeError,如何修复?
Python3中修复requests内容处理的TypeError问题
嘿,这个问题我太熟悉了——Python2和Python3在字符串/字节流的处理上差异很大,这就是你报错的根源!
问题原因
在Python3里,requests.get()返回的r.content是bytes类型(字节流),而你写的"\n \t/\"'"是str类型(字符串)。Python3严格区分这两种类型,不像Python2那样混为一谈,所以直接用str去操作bytes就会抛出TypeError: a bytes-like object is required, not 'str'。
两种修复方案
你可以根据自己的需求选下面任意一种:
方案1:先把字节流转成字符串处理
先将r.content解码为字符串,再使用字符串的translate方法(注意Python3的str.translate需要配合str.maketrans创建转换表):
# 先用合适的编码解码bytes为字符串,通常用utf-8,根据实际返回内容调整 content_str = r.content.decode('utf-8') # str.maketrans('', '', 要删除的字符) 表示创建一个删除指定字符的转换表 name = content_str.translate(str.maketrans('', '', "\n \t/\"'"))
如果不确定编码,也可以直接用r.text(requests会自动尝试识别响应编码),代码更简洁:
name = r.text.translate(str.maketrans('', '', "\n \t/\"'"))
方案2:直接处理字节流
如果你不需要转成字符串,想直接操作bytes,那把要删除的字符也转成bytes(加b前缀即可):
# 把要删除的字符串改成bytes类型(b前缀) name = r.content.translate(None, b"\n \t/\"'")
小提示
如果用方案1解码时出现乱码,记得检查响应的实际编码(可以看响应头里的Content-Type字段),把decode的参数改成对应的编码,比如decode('gbk')或者decode('utf-16')。
内容的提问来源于stack exchange,提问作者Martin Vegter
相关产品推荐
相关产品推荐

