使用Python结合BeautifulSoup与PIL获取指定URL图片路径及尺寸的报错修正
代码修正方案
原扩展代码直接触发报错的原因有3处,对应修正逻辑如下:
- 请求参数类型错误:代码中
requests.get(img)传入的是完整的img标签对象,并非实际的图片URL字符串,请求环节就会触发类型不匹配报错,需要传入img标签的src属性字符串值作为请求目标。 - 路径解析错误:多数网站的图片src是相对站点根目录的路径,直接请求会触发404状态码,需要通过URL拼接工具将相对路径转换为和主站匹配的绝对访问路径。
- 二进制流兼容性不足:直接读取请求返回的
.raw属性时,部分站点会返回压缩格式的流内容,PIL无法直接解析,需要补充流解码配置,同时增加异常捕获避免单个无效图片链接中断整个程序。
修正后可运行的完整代码
from requests_html import HTMLSession from bs4 import BeautifulSoup from PIL import Image from urllib.parse import urljoin import requests target_url = "https://www.example.com/" # 初始化会话保持请求一致性,降低被站点反爬拦截的概率 session = HTMLSession() page_response = session.get(target_url) soup = BeautifulSoup(page_response.text, "lxml") img_tag_list = soup.find_all("img") for img in img_tag_list: if not img.has_attr("src"): continue # 自动拼接图片绝对路径,兼容相对路径场景 img_full_url = urljoin(target_url, img["src"]) try: # 流式请求图片,不直接拉取全量文件内容,降低内存占用 img_resp = requests.get(img_full_url, stream=True, timeout=10) # 开启流解码,兼容带gzip压缩的图片返回 img_resp.raw.decode_content = True with Image.open(img_resp.raw) as img_handler: print(f"图片路径:{img_full_url},图片尺寸:{img_handler.size[0]} × {img_handler.size[1]}") # 主动关闭响应连接,避免资源泄漏 img_resp.close() except Exception as err: print(f"无法读取图片 {img_full_url} 的尺寸,错误信息:{str(err)}")
补充适配说明
- 如果运行时提示缺少
lxml依赖,可以将BeautifulSoup的解析参数替换为"html.parser",无需额外安装第三方解析库。- 如果遇到站点403拦截,可以在请求方法中补充浏览器格式的User-Agent请求头,模拟正常用户的访问特征。
内容的提问来源于stack exchange,提问作者chappers
相关产品推荐
相关产品推荐

