# 问题修复说明 ## 问题描述 服务器运行时出现以下错误: ``` [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` 便于排查 - ✅ 提供成功提取的反馈信息 **改进代码片段:** ```python # 检查是否是登录页面 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 - ✅ 添加详细的解析日志 - ✅ 统计解析的课程数量 **改进代码片段:** ```python # 检查是否需要重新登录 if grade_text == "LOGIN_REQUIRED": logger.warning("检测到登录失效,需要重新登录") return [] # 检查是否是原始HTML(未成功解析的标记) if '... [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 **测试状态:** 待用户测试确认