You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 02:39:09