简单利用python对成绩数据进行处理

事情是这样的,因为我是应届生,投简历后公司需要提供各科成绩。然后我进入学校的教务管理系统,找到成绩页面,点击右上角的数据转出导出了一个名为FileName.xls的文件。本以为这样就成功的导出了成绩,但是打开文件后Excel直接报错了,强制打开后则显示了一堆乱码。

没有办法我只能从网页下手了,我想到了直接保存当前页面然后用python对数据进行处理最后导出我所需要的成绩单。

实践

说干就干,直接打开ChatGPT然后经过一次次的试错终于写出了下面的脚本,为了更方便操作还写了一个图形化的界面。本来是想写成直接自动登录教务管理系统然后爬取相关数据进行处理的,但是登录界面有个人机验证给我难住了,最后秉持着能用就行的原则就不了了之了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
import pandas as pd
from bs4 import BeautifulSoup
import os
import tkinter as tk
from tkinter import filedialog, messagebox

def process_html_file(html_file_path, excel_file_path):
# 确保文件路径存在
if not os.path.isfile(html_file_path):
messagebox.showerror("错误", f"文件 {html_file_path} 不存在。")
return

# 读取HTML文件内容
with open(html_file_path, "r", encoding="utf-8") as file:
html_content = file.read()

# 使用BeautifulSoup解析HTML内容
soup = BeautifulSoup(html_content, "html.parser")

# 提取包含成绩数据的表格
tables = soup.find_all("table")

# 检查是否找到至少两个表格
if len(tables) < 2:
messagebox.showerror("错误", "找不到足够的表格。")
return

# 假设成绩数据在第二个表格(索引为1)
grades_table = tables[1]

# 提取表格中的数据
rows = grades_table.find_all("tr")
headers = [header.get_text(strip=True) for header in rows[0].find_all(["th", "td"])]
data = [[cell.get_text(strip=True) for cell in row.find_all(["th", "td"])] for row in rows[1:]]

# 使用pandas创建DataFrame
df = pd.DataFrame(data, columns=headers)

# 保存为 Excel 文件
try:
df.to_excel(excel_file_path, index=False)
messagebox.showinfo("成功", f"Excel 文件已保存为 '{excel_file_path}'")
except Exception as e:
messagebox.showerror("错误", f"保存 Excel 文件时出错: {e}")

def select_html_file():
file_path = filedialog.askopenfilename(
title="选择 HTML 文件",
filetypes=[("HTML Files", "*.html")]
)
if file_path:
html_file_entry.delete(0, tk.END)
html_file_entry.insert(0, file_path)

def select_save_location():
file_path = filedialog.asksaveasfilename(
title="保存为",
defaultextension=".xlsx",
filetypes=[("Excel Files", "*.xlsx")]
)
if file_path:
save_file_entry.delete(0, tk.END)
save_file_entry.insert(0, file_path)

def run_processing():
html_file_path = html_file_entry.get()
excel_file_path = save_file_entry.get()
if not html_file_path or not excel_file_path:
messagebox.showwarning("警告", "请确保选择了 HTML 文件和保存路径。")
return
process_html_file(html_file_path, excel_file_path)

# 创建主窗口
root = tk.Tk()
root.title("成绩数据提取器")

# HTML 文件选择
tk.Label(root, text="选择 HTML 文件:").grid(row=0, column=0, padx=10, pady=10, sticky="e")
html_file_entry = tk.Entry(root, width=50)
html_file_entry.grid(row=0, column=1, padx=10, pady=10)
tk.Button(root, text="浏览", command=select_html_file).grid(row=0, column=2, padx=10, pady=10)

# 保存路径选择
tk.Label(root, text="保存为 Excel 文件:").grid(row=1, column=0, padx=10, pady=10, sticky="e")
save_file_entry = tk.Entry(root, width=50)
save_file_entry.grid(row=1, column=1, padx=10, pady=10)
tk.Button(root, text="浏览", command=select_save_location).grid(row=1, column=2, padx=10, pady=10)

# 运行按钮
tk.Button(root, text="处理", command=run_processing).grid(row=2, column=0, columnspan=3, padx=10, pady=20)

# 启动主循环
root.mainloop()

后续

正当我因为成功导出了相关数据而沾沾自喜的时候突然发现,成绩的表格可以直接在网页端复制粘贴到Excel中,因为有些网页的表格在复制粘贴后会变成一堆乱码,导致我思维固化了,并没有第一时间尝试直接复制粘贴,导致浪费了时间写了一堆无用的代码。