使用BeautifulSoup抓取Reddit图片时find()返回None但元素存在如何解决
问题排查与解决方案
问题根源
返回None主要来自三个问题:
- 代码缺失
import requests导入语句,直接运行会先触发导入错误,无法正常拉取页面内容 - 未配置合法请求头:Reddit会直接拦截无标准
User-Agent的HTTP请求,你拿到的返回内容是反爬提示页,不存在目标类对应的元素 - 页面动态渲染:Reddit当前前端页面为客户端渲染生成,静态请求拿到的原始HTML中没有
ImageBox-image类元素,BS4仅能解析静态HTML,自然找不到目标内容
解决方法
方法一:调用Reddit结构化接口(最简便)
Reddit所有帖子页面支持直接在地址后加.json后缀获取结构化JSON数据,无需解析前端页面,调整后代码如下:
import requests headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" } # 帖子地址后加.json获取结构化数据 url = "https://www.reddit.com/r/wallpaper/comments/qswblq/the_frontier_by_me_5120x2880/.json" resp = requests.get(url, headers=headers) data = resp.json() # 直接提取图片链接 img_url = data[0]['data']['children'][0]['data']['url_overridden_by_dest'] print(img_url)
方法二:使用动态渲染工具解析完整页面
如果需要解析前端渲染后的完整页面内容,可以使用selenium、playwright这类工具加载页面后再解析:
from selenium import webdriver from bs4 import BeautifulSoup driver = webdriver.Chrome() driver.get("https://www.reddit.com/r/wallpaper/comments/qswblq/the_frontier_by_me_5120x2880/") # 等待页面加载完成后获取完整渲染后的HTML page_html = driver.page_source soup = BeautifulSoup(page_html, "html.parser") print(soup.find(class_="ImageBox-image")['src']) driver.quit()
注:使用该方案需要提前安装对应工具的驱动与依赖包
内容的提问来源于stack exchange,提问作者Jacob Hamilton
相关产品推荐
相关产品推荐

