jianyu/questions/pachong.py

105 lines
4.2 KiB
Python
Raw Normal View History

2024-04-09 06:33:15 +00:00
"""
这个文件会根据对应的试卷code去网站上提取它的题目和答案并处理成可以被简浴包分析的 Lua 文件
请注意生成文件后你需要手动
1. 添加公式/删除其中含有图片含有资料的题目
2. 修改英文冒号为中文冒号
3. 修改百分号为双百分号
4. 把所有填入画横线部分的线画出来
目前的爬虫程序做不到这些
"""
import requests
from bs4 import BeautifulSoup
code = "1706852967747"
# 获取选择题网页内容
url_questions = f'https://www.gkzenti.cn/paper/{code}'
response_questions = requests.get(url_questions)
html_content_questions = response_questions.text
# 使用BeautifulSoup解析HTML
soup_questions = BeautifulSoup(html_content_questions, 'html.parser')
# 找到所有包含选择题的div元素
questions_divs = soup_questions.find_all('div', class_='row')
# 定义Lua列表
lua_list = []
# 遍历每个问题的div元素
for idx, question_div in enumerate(questions_divs, start=1):
# 检查是否包含正确的结构
if question_div.find('div', class_='col-xs-1 left') is None or question_div.find('div', class_='col-xs-11 right') is None:
continue
# 获取题干内容,包括多行的情况
question_text_elements = question_div.find('div', class_='col-xs-11 right').find_all('p')
question_text = '<br>\n'.join([element.get_text(strip=True) for element in question_text_elements])
# 寻找所有的选项,包括 <div class="col-xs-3">, <div class="col-xs-6"> 和 <div class="col-xs-12">
options_divs = question_div.find_all('div', class_=['col-xs-3', 'col-xs-12', 'col-xs-6'])
options = [option.get_text(strip=True) for option in options_divs]
# 构建Lua语言中的列表结构
lua_question = [
question_text,
[option for option in options],
"" # 此处使用空字符串,因为答案是一个字符串而不是列表
]
lua_list.append(lua_question)
# 获取答案网页内容
url_answers = f'https://www.gkzenti.cn/answer/{code}'
response_answers = requests.get(url_answers)
html_content_answers = response_answers.text
# 使用BeautifulSoup解析HTML
soup_answers = BeautifulSoup(html_content_answers, 'html.parser')
# 找到包含答案的div元素
answers_divs = soup_answers.find_all('div', class_='col-xs-1-5')
# 获取所有答案信息
answers_info = [item.get_text(strip=True) for item in answers_divs]
# 将答案信息添加到相应题目的答案区域
for idx, lua_question in enumerate(lua_list):
if idx < len(answers_info):
lua_question[2] = answers_info[idx][-1] # 只需要它后面的那个选项就行
# 将数据存储到文件中
with open(f'{code}.lua', 'w', encoding='utf-8') as file:
file.write(f"-- 试卷来源:{url_questions},答案来源:{url_answers}\n"
f"-- 由爬虫自动生成,请手动检查:\n"
f"-- 1. 添加公式/删除其中含有图片、含有资料的题目;\n"
f"-- 2. 修改英文冒号为中文冒号;\n"
f"-- 3. 修改百分号为双百分号;\n"
f"-- 4. 把所有填入画横线部分的线画出来。\n"
f"-- 已检查在此打勾:【】\n\n")
file.write("local questions = {\n")
for idx, lua_question in enumerate(lua_list, start=1):
file.write(f" -- {idx}\n")
# # 有一些这些题号的题目并不是这些题目
#
# if idx in range(71, 81):
# file.write(f" -- 该题已被删除,因为是图形推理题\n")
# continue
#
# if idx in range(106, 131):
# file.write(f" -- 该题已被删除,因为是资料分析题\n")
# continue
file.write(" {\n")
for item in lua_question:
if isinstance(item, list): # 如果这是一个列表(也就是选项的列表)
file.write(" {\n")
for subitem in item:
file.write(f' [[{subitem}]],\n')
file.write(" },\n")
else: # 如果这不是一个列表(也就是要么是题干,要么是正确答案)
file.write(f' [[{item}]],\n')
file.write(" },\n")
file.write("}\n\nreturn questions\n")