BeautifulSoup使用select按CSS类名查找元素返回空列表如何解决
问题排查结果
你的代码语法没有错误,返回空列表的核心原因是目标站点为单页应用(SPA),所有页面内容依赖客户端JS动态渲染生成。requests.get() 只能获取到服务端返回的初始静态HTML,这份HTML里还没有生成带有.ant-card-body类的DOM节点,因此BeautifulSoup无法匹配到对应元素。
另外你请求的URL里#后的哈希路由部分不会被requests传递给服务端,不过这不是本次问题的核心原因,模拟浏览器时会自动处理哈希路由的逻辑。
可行解决方案
- 方案一:使用模拟浏览器工具爬取动态渲染内容
可以使用Selenium、Playwright等工具模拟浏览器运行,等待页面JS执行完成、元素渲染完毕后再提取内容,以下是Playwright的示例代码:
from playwright.sync_api import sync_playwright from bs4 import BeautifulSoup url = "https://solanamonkeysclub.com/#/#mint" with sync_playwright() as p: # 启动无头浏览器 browser = p.chromium.launch(headless=True) page = browser.new_page() page.goto(url) # 等待目标元素渲染完成,最多等待10秒 page.wait_for_selector('.ant-card-body', timeout=10000) # 获取渲染完成后的页面HTML html = page.content() browser.close() soup = BeautifulSoup(html, 'html.parser') new_elems = str(soup.select('.ant-card-body')) print(f'{"new_elem":10} : {new_elems}')
- 方案二:直接调用后端接口获取数据
打开浏览器开发者工具的「网络」面板,筛选Fetch/XHR类型的请求,刷新页面后找到返回卡片数据的后端接口,直接请求该接口获取结构化数据,该方案效率远高于渲染页面后提取内容。
内容的提问来源于stack exchange,提问作者koyamashinji
相关产品推荐
相关产品推荐

