BeautifulSoup提取img链接时find_all返回空列表问题排查
问题排查结论
你锁定的id="gallery-1"节点确实是页面存放图库内容的目标DOM区域,但当前代码无法拿到结果,核心问题有两个:
- 你的属性匹配规则写死了完整class字符串:硬编码的class值中包含和文章ID绑定的
galleryid-268780字段,实际请求返回的页面对应节点的class列表和你写的内容不完全一致,BeautifulSoup做属性完全匹配时找不到对应节点,因此返回空列表。 - 就算匹配到容器节点,直接读取img标签的
src属性也拿不到原图,页面默认加载的是低分辨率缩略图,原图地址存放在img的data-src属性、或是img外层a标签的href属性中。
修正代码
定位节点时优先用唯一固定的id属性,不要硬编码易变的拼接class值,参考实现如下:
import requests from bs4 import BeautifulSoup headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.5005.63 Safari/537.36'} r = requests.get('https://www.f1-fansite.com/f1-wallpaper/wallpaper-photos-2022-canadian-f1-grand-prix/', headers=headers) soup = BeautifulSoup(r.content, 'lxml') # 仅通过唯一id定位图库容器,跳过易变的class匹配 gallery = soup.find('div', id='gallery-1') img_urls = [] if gallery: for img_tag in gallery.find_all('img'): # 优先读取懒加载属性里的原图地址,兜底取src url = img_tag.get('data-src', img_tag.get('src')) if url: img_urls.append(url) print(img_urls)
补充说明
如果运行后拿到的地址仍然是带尺寸裁剪参数的缩略图,可以遍历每个img标签对应的父级a标签,取a标签的href属性值,该值为点击图片后跳转的无裁剪原图地址。
定位DOM节点时,尽量不要把动态生成、和页面/文章ID绑定的属性作为全匹配条件,优先选择id、固定功能类名这类不会随页面配置变动的属性做筛选,能大幅降低定位失效的概率。
内容的提问来源于stack exchange,提问作者user3023117
相关产品推荐
相关产品推荐

