Python3.6网页爬取遇bytes对象错误:无format方法及类型不匹配
解决Python爬虫中的bytes格式化与类型不匹配问题
首先来说你遇到的两个问题,其实根源都是Python3里str和bytes严格区分导致的,咱们一步步来解决:
1. 解决AttributeError: 'bytes' object has no attribute 'format'
你写的b'{0}.jpg'.format(...)是典型的误区——format()是字符串(str)的专属方法,bytes对象根本没有这个属性。正确的做法是先完成字符串的格式化,再根据需求编码成bytes(甚至大多数场景下,直接用字符串作为文件名传给open()就够了)。
2. 解决“a bytes-like object is required, not 'str'”类型错误
这个错误出在flim.title.encode('utf8').replace(':','')这里:当你对bytes对象调用replace()时,替换的旧值和新值都必须是bytes类型,你传了字符串的':',类型不匹配自然报错,得改成replace(b':', b'')才行。
修正后的代码(推荐写法)
我给你调整成更规范的写法,还用上了with语句自动管理文件(比手动close()更安全):
# 先处理字符串形式的文件名:替换标题里的冒号,拼接jpg后缀 filename = "{0}.jpg".format(flim.title.replace(":", "")) # 用with语句打开文件并写入内容 with open(filename, "wb") as f: f.write(requests.get(all_img[1]["src"]).content)
如果你确实需要bytes类型的文件名(特殊场景)
如果因为系统或其他需求必须用bytes作为文件名,那就先处理好字符串再编码:
filename_str = "{0}.jpg".format(flim.title.replace(":", "")) filename_bytes = filename_str.encode("utf8") with open(filename_bytes, "wb") as f: f.write(requests.get(all_img[1]["src"]).content)
最后再啰嗦两句
在Python3里,str和bytes是完全独立的类型,千万别混用操作:
- 要格式化就先搞字符串,再转bytes(如果需要)
- 对bytes做操作(比如replace、find)时,所有参数都得是bytes类型(加b前缀,比如
b':')
内容的提问来源于stack exchange,提问作者Innat
相关产品推荐
相关产品推荐

