Files
GPA_Monitoring/修复说明_2026-01-21.md
ChuXun d1dc08a16d 1
2026-01-29 03:39:01 +08:00

5.5 KiB
Raw Blame History

问题修复说明

问题描述

服务器运行时出现以下错误:

[WARNING] 未能提取到成绩信息,返回原始文本
[INFO] 成绩无变化(共 0 门课程)

根本原因

成绩提取函数 extract_grade_info 在某些情况下无法正确解析HTML页面返回原始HTML文本导致 parse_courses 函数无法从原始HTML中提取课程信息。

可能的具体原因包括:

  1. BeautifulSoup 库未安装
  2. 登录会话失效,返回的是登录页面
  3. 学校网页结构发生变化
  4. 网络问题导致获取的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. 创建诊断工具

新增文件:

  1. diagnose.sh - 自动诊断脚本

    • 检查依赖库安装
    • 运行测试并分析结果
    • 提供修复建议
  2. 故障排查指南.md - 详细的排查文档

    • 常见问题及解决方案
    • 调试流程说明
    • 联系支持信息
  3. 更新 常见问题解决.md - 添加新问题说明

  4. 更新 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 门课程

优势

  1. 更好的错误提示 - 明确告知问题原因
  2. 自动保存调试信息 - debug_page.html 便于排查
  3. 灵活的表格查找 - 支持多种网页结构
  4. 详细的日志 - 方便追踪每一步
  5. 完善的文档 - 提供多种解决方案

注意事项

  1. 不要过度使用调试模式 - 生产环境可能不需要
  2. 定期检查 debug_page.html - 了解实际获取的内容
  3. 及时更新表格选择器 - 如果学校网页结构变化
  4. 保护敏感信息 - debug_page.html 可能包含个人信息

下一步

如果问题仍未解决:

  1. 查看 debug_page.html 的实际内容
  2. 检查HTML中的表格结构
  3. 可能需要调整 extract_grade_info 中的选择器
  4. 咨询开发者或提交 Issue

版本: 2026-01-21
修复人员: GitHub Copilot
测试状态: 待用户测试确认