5.5 KiB
5.5 KiB
问题修复说明
问题描述
服务器运行时出现以下错误:
[WARNING] 未能提取到成绩信息,返回原始文本
[INFO] 成绩无变化(共 0 门课程)
根本原因
成绩提取函数 extract_grade_info 在某些情况下无法正确解析HTML页面,返回原始HTML文本,导致 parse_courses 函数无法从原始HTML中提取课程信息。
可能的具体原因包括:
- BeautifulSoup 库未安装
- 登录会话失效,返回的是登录页面
- 学校网页结构发生变化
- 网络问题导致获取的HTML不完整
修复内容
1. 改进 extract_grade_info 函数 (monitor.py 第286-370行)
新增功能:
- ✅ 检测登录页面,返回特殊标记
LOGIN_REQUIRED - ✅ 支持多种表格选择器(
gridtable,dataList, 关键词搜索) - ✅ 添加详细的调试日志(表头、行数等)
- ✅ 自动保存问题HTML到
debug_page.html便于排查 - ✅ 提供成功提取的反馈信息
改进代码片段:
# 检查是否是登录页面
if soup.find('input', {'name': 'username'}) or soup.find('input', {'name': 'password'}):
logger.error("检测到登录页面,可能需要重新登录")
return "LOGIN_REQUIRED"
# 尝试多种方式查找成绩表格
table = soup.find('table', {'class': 'gridtable'})
if not table:
table = soup.find('table', {'id': 'dataList'})
if not table:
# 尝试查找任何包含成绩相关标题的表格
for tbl in soup.find_all('table'):
headers = tbl.find_all('th')
if headers and any('课程名称' in th.get_text() or '成绩' in th.get_text() for th in headers):
table = tbl
logger.info("通过表头关键词找到成绩表格")
break
2. 改进 parse_courses 函数 (monitor.py 第347-378行)
新增功能:
- ✅ 检测
LOGIN_REQUIRED标记 - ✅ 检测未解析的原始HTML
- ✅ 添加详细的解析日志
- ✅ 统计解析的课程数量
改进代码片段:
# 检查是否需要重新登录
if grade_text == "LOGIN_REQUIRED":
logger.warning("检测到登录失效,需要重新登录")
return []
# 检查是否是原始HTML(未成功解析的标记)
if '<html' in grade_text.lower() or '<body' in grade_text.lower():
logger.warning("检测到未解析的HTML内容,成绩提取可能失败")
logger.debug(f"文本前100字符: {grade_text[:100]}")
return []
3. 添加调试模式 (monitor.py 第743-797行)
新增命令行参数:
python3 monitor.py --debug # 启用详细日志
功能:
- 显示详细的调试信息
- 帮助快速定位问题
- 不影响正常运行模式
4. 创建诊断工具
新增文件:
-
diagnose.sh - 自动诊断脚本
- 检查依赖库安装
- 运行测试并分析结果
- 提供修复建议
-
故障排查指南.md - 详细的排查文档
- 常见问题及解决方案
- 调试流程说明
- 联系支持信息
-
更新 常见问题解决.md - 添加新问题说明
-
更新 readme.md - 添加快速诊断指引
使用方法
方式1:自动诊断(推荐)
cd ~/grade_monitor
chmod +x diagnose.sh
./diagnose.sh
方式2:手动调试
# 1. 检查依赖
pip3 install -r requirements.txt
# 2. 运行调试模式
python3 monitor.py --test --debug
# 3. 查看输出
cat .last_grade_content.txt
cat debug_page.html | head -50
# 4. 如果正常,重启服务
systemctl restart grade-monitor
方式3:启用服务调试模式
编辑服务配置:
sudo nano /etc/systemd/system/grade-monitor.service
修改启动命令:
ExecStart=/usr/bin/python3 /home/yourusername/grade_monitor/monitor.py --debug
重新加载:
sudo systemctl daemon-reload
sudo systemctl restart grade-monitor
预期效果
正常运行时的日志
[DEBUG] 找到总平均绩点: 总平均绩点:3.85
[DEBUG] 找到成绩表格
[DEBUG] 表头: ['学年学期', '课程代码', '课程序号', '课程名称', ...]
[DEBUG] 找到 15 行成绩数据
[INFO] 成功提取成绩信息,共 17 行
[DEBUG] 开始解析成绩,共 17 行
[DEBUG] 解析到课程: 高等数学A(1)
[DEBUG] 解析到课程: 线性代数
...
[INFO] 共解析到 15 门课程
[INFO] 成绩无变化(共 15 门课程)
出错时的日志
[WARNING] 未找到成绩表格
[WARNING] 未能提取到成绩信息,页面可能结构异常
[INFO] 已保存HTML到 /home/user/grade_monitor/debug_page.html 供调试
[WARNING] 检测到未解析的HTML内容,成绩提取可能失败
[DEBUG] 文本前100字符: <!DOCTYPE html><html><head>...
[INFO] 共解析到 0 门课程
优势
- 更好的错误提示 - 明确告知问题原因
- 自动保存调试信息 - debug_page.html 便于排查
- 灵活的表格查找 - 支持多种网页结构
- 详细的日志 - 方便追踪每一步
- 完善的文档 - 提供多种解决方案
注意事项
- 不要过度使用调试模式 - 生产环境可能不需要
- 定期检查 debug_page.html - 了解实际获取的内容
- 及时更新表格选择器 - 如果学校网页结构变化
- 保护敏感信息 - debug_page.html 可能包含个人信息
下一步
如果问题仍未解决:
- 查看
debug_page.html的实际内容 - 检查HTML中的表格结构
- 可能需要调整
extract_grade_info中的选择器 - 咨询开发者或提交 Issue
版本: 2026-01-21
修复人员: GitHub Copilot
测试状态: 待用户测试确认