This commit is contained in:
ChuXun
2026-01-29 03:39:01 +08:00
parent 0da692ab97
commit d1dc08a16d
12 changed files with 1607 additions and 39 deletions

202
修复说明_2026-01-21.md Normal file
View File

@@ -0,0 +1,202 @@
# 问题修复说明
## 问题描述
服务器运行时出现以下错误:
```
[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
**测试状态:** 待用户测试确认