如何使用BeautifulSoup爬取嵌套div内的测试题全量数据
问题根因
你拿到空DOM结构的核心原因是站点题目采用前端动态渲染逻辑:requests.get() 只能获取服务器返回的初始静态HTML骨架,也就是你打印出来的空嵌套容器,实际题目ID、题干、选项、答案、解析这些内容,是浏览器加载完初始页面后,携带登录会话向后端接口拉取数据,再通过JS填充到对应DOM节点里的。BeautifulSoup不具备执行JS的能力,自然无法获取填充后的实际内容。
可行解决方案
方案1:直接调用后端数据接口(推荐,效率最高稳定性最好)
- 抓包定位真实数据接口:打开浏览器开发者工具(F12),切换到「Network」面板,筛选「Fetch/XHR」请求类型,刷新题目页面,逐个查看接口响应内容,找到返回100道题结构化数据(包含题目ID、题干、选项、答案、解析字段)的接口,记录接口地址、请求方法、必填请求头、请求参数规则。
- 复用现有登录会话请求接口:直接用你已经完成登录鉴权的
requests.Session对象请求该接口,拿到的JSON响应就是全量结构化题目数据,无需解析HTML。
参考代码框架:
import requests import json with requests.session() as s: # 原有登录逻辑保持不变 s.post(loginURL, data=payLoad).raise_for_status() # 替换为抓包获取的真实题目接口地址 question_api = "你的题目数据接口地址" # 补全接口要求的请求头,大部分站点会校验Referer、UA req_headers = { "Referer": targetURL, "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36" } resp = s.get(question_api, headers=req_headers) resp.raise_for_status() # 解析接口返回的JSON数据即可拿到全量题目内容 all_questions = resp.json()
方案2:使用支持JS渲染的工具(适合接口加密参数难以逆向的场景)
如果接口加了动态签名、加密参数没法直接调用,换用Playwright、Selenium这类可以模拟真实浏览器执行JS的工具,打开目标页面后等待JS执行完成、所有题目内容填充到DOM后再做解析。
提取内容时注意节点匹配规则:
- 题目ID:提取class为
DisplayQNr的节点文本 - 题干:提取class为
qText的节点文本/内部HTML - 选项:遍历class为
QuestionOptions下的4个选项子节点逐个提取 - 答案、解析:默认是隐藏状态,需要先模拟点击class为
showSolutionBtn的按钮,等内容加载完成后,再分别提取class为QuestionCorrectOptions(正确答案)、DetailedSolution(详细解析)的节点内容。
内容的提问来源于stack exchange,提问作者Abhishek
相关产品推荐
相关产品推荐

