从网页自动提取「形势与政策」题库
摘要:本文分享一个高效提取“形势与政策”在线自测题库的方法——通过保存网页为HTML文件,再用Python脚本自动解析题目、选项与正确答案,最终生成整洁的文本题库。适用于学生复习、资料整理或二次开发。
背景
“形势与政策”是高校思想政治教育的重要组成部分,许多学校通过在线学习平台(如超星、智慧树等)布置自测任务。这些平台通常会在提交后显示所有题目的正确答案,但不提供导出功能。手动搜题费时费力,还容易出错。
有没有办法自动化这一过程?答案是肯定的!
本文将手把手教你:
- 如何保存包含题目的网页;
- 如何用一段Python脚本自动提取题目和答案;
- 脚本原理与关键代码解析。
🔧 环境要求:Python 3.x,无需额外安装库。
第一步:保存网页为HTML文件
- 进入课程的“自测”界面;
- 创建一套自测题并直接提交(无需答题);
- 提交后页面会显示所有题目及正确答案;
- 在浏览器中按下
Ctrl + S(Windows)或Cmd + S(Mac),将页面保存为完整网页(即xxxx.html的 html 文件); - 确保保存的是包含题目的完整HTML,而非仅链接。
💡提示:部分平台可能有反爬机制,若无法正常保存,可尝试使用浏览器开发者工具(F12)复制
<body>内容,手动构建HTML文件。
第二步:运行Python脚本提取题库
将以下代码保存为 extract.py,与 查看详情.html 放在同一目录下,运行即可生成 形势与政策7.txt 文件。
import re
import html
import os
def clean_text(text):
if not text:
return ""
text = re.sub(r"<[^>]+>", "", text) # 去除HTML标签
text = html.unescape(text) # 解码HTML实体(如 )
text = re.sub(r"\s+", " ", text).strip() # 合并多余空白
return text
def main():
input_file = "查看详情.html"
output_file = "形势与政策7.txt"
if not os.path.exists(input_file):
print(f"错误:未找到文件 {input_file}")
return
with open(input_file, "r", encoding="utf-8") as f:
content = f.read()
# 定位主容器(含所有题目的区域)
start_match = re.search(r'<div[^>]*id="fanyaMarking"[^>]*>', content)
if start_match:
content = content[start_match.start():]
else:
print("警告:未找到主容器 'fanyaMarking',将处理整个文件。")
# 按题型标题分割(如“单选题”、“多选题”)
parts = re.split(r'(<h2[^>]*class="type_tit"[^>]*>.*?</h2>)', content, flags=re.S)
results = []
for part in parts:
if not part.strip():
continue
# 如果是题型标题
if 'type_tit' in part:
header = clean_text(part)
results.append(f"\n{header}\n")
else:
# 分割每一道题
questions = re.split(r'<div class="marBom60 questionLi', part)
for q_block in questions:
if "<h3" not in q_block: # 跳过无效块
continue
# 提取题目
q_match = re.search(r"<h3[^>]*>(.*?)</h3>", q_block, re.S)
if not q_match:
continue
q_text = clean_text(q_match.group(1))
# 提取选项
options = ""
ul_match = re.search(r'<ul[^>]*class="mark_letter colorDeep qtDetail"[^>]*>(.*?)</ul>', q_block, re.S)
if ul_match:
lis = re.findall(r"<li[^>]*>(.*?)</li>", ul_match.group(1), re.S)
for li in lis:
options += clean_text(li) + "\n"
# 提取正确答案
ans_match = re.search(r'<span[^>]*class="rightAnswerContent"[^>]*>(.*?)</span>', q_block, re.S)
answer = clean_text(ans_match.group(1)) if ans_match else ""
# 格式化输出
results.append(f"{q_text}\n{options}答案:{answer}\n")
with open(output_file, "w", encoding="utf-8") as f:
f.write("\n".join(results))
print(f"✅ 提取完成!题库已保存至:{output_file}")
if __name__ == "__main__":
main()
运行效果示例
生成的 形势与政策7.txt 内容如下:
一. 单选题(共 223 题)
1. (单选题)“十四五”时期,我们坚持以人民为中心的发展思想,在高质 量发展中持续加大民生投入,着力解决人民群众急难愁盼问题,不断书写温暖人心的民生答卷。下列关于我国民生福祉的说法错误的是( )。
A. 实施重大专项支持一批托育综合服务中心、公办托育机构和普 惠性托位建设
B. 全国城镇新增就业人口连续 4 年保持在 1200 万人以上
C. 全国劳动年龄人口平均受教育年限从 2020 年的 10.8 年提升至 2024 年的 11.3 年,已超过高收入国家水平
D. 国产创新药数量和质量齐升,国产创新药获批上市数量是 “十三五”时期的 2.8 倍
答案:C
2. (单选题)2024年10月16日,习近平总书记给中国国际大学生创新大赛(2024)总决赛参赛学生代表回信,充分肯定大赛在促进学生创新实践、增进中外青年友谊方面的重要作用,勉励广大青年学生要弘扬科学精神,积极投身科技创新,为促进中外科技交流、推动科技进步贡献青春力量。中国国际大学生创新大赛质量再创新高,凸显人才培养模式向()转变。
A. “政治素养培养为先”
B. “道德素养培养为先”
C. “能力素质培养为先”
D. “知识素养培养为先”
答案:C
。。。。
二. 多选题(共 182 题)
1. (多选题)市场是最稀缺的资源,无论国际风云如何变幻,()、()、()、()的国内市场始终是我们应对各种风险挑战的有力保障。
A. 规模庞大
B. 层次多样
C. 外向依存
D. 潜力巨大
E. 统一开放
答案:ABDE
2. (多选题)2025年4月29日,习近平总书记在上海考察时强调,“发展人工只能前景广阔,要加强()和()。
A. 政策支持
B. 技术支持
C. 资金支持
D. 人才培养
E. 队伍建设
答案:AD
。。。。
三. 判断题(共 95 题)
1. (判断题)今年3月22日是第三十三届“世界水日”。
A. 对
B. 错
答案:对
2. (判断题)七七事变是全民族抗战的开始。
A. 对
B. 错
答案:对
。。。。
技术解析:脚本是如何工作的?
- HTML清洗:
clean_text()函数去除标签、解码特殊字符、清理空格,确保文本干净; - 定位内容区域:通过
id="fanyaMarking"找到题目所在的主容器,避免处理无关内容; - 按题型分组:利用
<h2 class="type_tit">分割“单选题”“多选题”等板块; - 逐题解析:
- 题目在
<h3>标签内; - 选项在
<ul class="mark_letter ...">的<li>中; - 正确答案在
<span class="rightAnswerContent">中;
- 题目在
- 结构化输出:按人类可读格式组织题目、选项与答案。
注意事项与扩展建议
- 平台差异:不同学校的平台HTML结构可能略有不同,若脚本失效,可检查类名(如
questionLi、rightAnswerContent)是否变化,并相应调整正则表达式。 - 尊重版权:提取内容仅限个人学习使用,请勿用于商业传播。
结语
通过简单的网页保存 + Python正则解析,我们就能将封闭的在线题库转化为开放、可编辑的文本资源。这不仅提升了学习效率,也体现了“用技术解决实际问题”的乐趣。
如果你觉得这个脚本有用,欢迎收藏、转发,或在评论区分享你的改进版本!
评论