203 lines
5.5 KiB
Markdown
203 lines
5.5 KiB
Markdown
# 问题修复说明
|
||
|
||
## 问题描述
|
||
|
||
服务器运行时出现以下错误:
|
||
```
|
||
[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
|
||
**测试状态:** 待用户测试确认
|