BeautifulSoup图片下载报错:TypeError类型错误求解
解决爬取图片时的TypeError:需要bytes-like对象而非Response
嘿,我来帮你搞定这个问题!你遇到的这个报错其实很常见——f.write(requests.get(img))里直接传了requests的Response对象,但文件写入需要的是字节数据,所以才会提示类型不匹配。
正确的写法是什么?
requests.get(img)返回的是一个Response对象,你需要取它的.content属性,这个属性才是图片的二进制字节流,所以代码应该改成:
f.write(requests.get(img).content)
不过更稳妥的做法是先把Response对象存下来,顺便检查请求是否成功,避免无效URL导致的错误,比如:
response = requests.get(img) # 检查请求是否成功(状态码200) if response.status_code == 200: f.write(response.content)
结合你的代码给出完整示例
我把你提到的模块导入、目录创建、页面解析和图片下载整合起来,给你一个完整的可运行示例:
import os import requests from bs4 import BeautifulSoup # 创建保存图片的目录,避免找不到路径 dir_path = os.path.join(os.getcwd(), "downloaded_images") if not os.path.exists(dir_path): os.makedirs(dir_path) # 假设你已经通过某种方式获取了页面源码source soup = BeautifulSoup(source, 'html.parser') # 找到页面中所有的img标签(你可以根据实际需求调整选择器,比如指定class) img_tags = soup.find_all('img') for img_tag in img_tags: img_url = img_tag.get('src') if not img_url: continue # 跳过没有src属性的无效图片标签 try: # 发送请求获取图片二进制内容 response = requests.get(img_url) response.raise_for_status() # 如果请求失败(比如404、500),直接抛出异常 # 生成图片保存的文件名,这里简单用URL的最后一部分,你也可以自定义命名规则 img_filename = os.path.basename(img_url) # 拼接完整的保存路径 save_path = os.path.join(dir_path, img_filename) # 以二进制写入模式打开文件,写入图片内容 with open(save_path, 'wb') as f: f.write(response.content) print(f"图片下载成功:{save_path}") except Exception as e: print(f"下载图片 {img_url} 失败:{str(e)}")
几个关键细节说明
为什么用
.content而不是.text?.content是Response对象的二进制响应内容,专门用来处理图片、视频这类非文本文件;.text是把响应内容解码成文本字符串,用来处理HTML、JSON这类文本数据,用在图片上会导致乱码或者写入失败。
文件打开模式必须是
'wb''w'是文本写入模式,而图片是二进制文件,必须用'wb'(write binary)模式打开,否则会报错或者图片损坏。
关于BeautifulSoup的初始化
你用的soup = BeautifulSoup(source, 'html.parser')完全没问题!示例里的soup = BeautifulSoup(r.content)只是因为示例中直接用了requests请求页面的响应内容r.content,本质上都是传入页面的HTML源码,你的写法不需要调整。
内容的提问来源于stack exchange,提问作者cloudjumper2000
相关产品推荐
相关产品推荐

