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

203 lines
5.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 问题修复说明
## 问题描述
服务器运行时出现以下错误:
```
[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 '<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行)
**新增命令行参数:**
```bash
python3 monitor.py --debug # 启用详细日志
```
**功能:**
- 显示详细的调试信息
- 帮助快速定位问题
- 不影响正常运行模式
### 4. 创建诊断工具
**新增文件:**
1. **diagnose.sh** - 自动诊断脚本
- 检查依赖库安装
- 运行测试并分析结果
- 提供修复建议
2. **故障排查指南.md** - 详细的排查文档
- 常见问题及解决方案
- 调试流程说明
- 联系支持信息
3. **更新 常见问题解决.md** - 添加新问题说明
4. **更新 readme.md** - 添加快速诊断指引
## 使用方法
### 方式1自动诊断推荐
```bash
cd ~/grade_monitor
chmod +x diagnose.sh
./diagnose.sh
```
### 方式2手动调试
```bash
# 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启用服务调试模式
编辑服务配置:
```bash
sudo nano /etc/systemd/system/grade-monitor.service
```
修改启动命令:
```ini
ExecStart=/usr/bin/python3 /home/yourusername/grade_monitor/monitor.py --debug
```
重新加载:
```bash
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
**测试状态:** 待用户测试确认