@fcutim07: Namen sollte man nicht kryptisch abkürzen. Also nicht `s` wenn man `session` meint, oder `f` wenn `file` gemeint ist, oder `su` für `subject`.
Die `Session`-Objekte sind Kontextmanager, die sollte man mit ``with`` zusammen verwenden.
Beim öffnen von Textdateien sollte man immer explizit die Kodierung angeben. Und bei HTML im Header auch welche Kodierung das ist, sonst läuft das auf diverse Heuristiken hinaus mit denen die Kodierung geraten wird, und das muss nicht korrekt sein.
Die Wochentage stehen auf Englisch in der HTML, alles andere ist Deutsch‽
`weekday` ist bereits eine Zeichenkette. `str()` macht da keinen Sinn.
Das zusammenstückeln von Zeichenketten und Werten mittels ``+`` und `str()` ist eher BASIC als Python. Dafür gibt es die `format()`-Methode auf Zeichenketten und f-Zeichenkettenliterale.
Wenn es mehrere `period` in einer `cell` gibt, dann werden die Fächerlisten ohne irgendein Trennzeichen aneinandergeklebt, das ist sicher so nicht gewollt.
Wenn man irgendwelche Daten in HTML schreibt von denen man nicht weiss ob die vielleicht Sonderzeichen enthalten die in HTML eine besondere Bedeutung haben, muss man sicherstellen das diese Zeichen „escaped“ werden. Bei Datum/Zeit und den Wochentagen kann man ja recht sicher sein, aber was die Fächer enthalten, ist unsicher. Wobei man natürlich auch auf nummer sicher gehen kann, und einfach alles was man da an Werten einsetzt, escapen kann.
Ungetestet:
Code: Alles auswählen
#!/usr/bin/env python3
import html
from datetime import datetime as DateTime
from webuntis import Session
ENCODING = "UTF-8"
def is_given_weekday(date_number, weekday):
return DateTime.strptime(str(date_number), "%Y%m%d").weekday() == weekday
def main():
monday = 20240226
friday = 20240301
assert is_given_weekday(monday, 0), f"{monday} is no monday"
assert is_given_weekday(friday, 4), f"{friday} is no friday"
with Session(
server="chios.webuntis.com",
username="user",
password="password",
school="schule",
useragent="WebUntis Test",
) as session:
session.login()
table = session.timetable(
klasse=session.klassen().filter(name="class")[0],
start=monday,
end=friday,
).to_table()
with open("test.html", "w", encoding=ENCODING) as file:
file.write(
"<!DOCTYPE html>\n"
"<html>\n"
"<head>\n"
f'<meta charset="{html.escape(ENCODING, True)}">\n'
"<title>Stundenplan</title>\n"
'<link rel="stylesheet" type="text/css" href="style.css">\n'
"</head>\n"
"<body>\n"
'<table border="1"><thead><th>Time</th>'
)
for weekday in [
"Montag",
"Dienstag",
"Mittwoch",
"Donnerstag",
"Freitag",
]:
file.write(f"<th>{html.escape(weekday)}</th>")
file.write("</thead><tbody>")
for time, row in table:
file.write(f"<tr><td>{time:%H:%M}</td>")
for _date, cell in row:
file.write("<td>")
if cell:
#
# BUG If there is more than one `period` then the
# subject lists are concatenated without any
# separator! Either separate them or make sure
# there's only one such list per `cell` written.
#
for period in cell:
file.write(
html.escape(
", ".join(
subject.name
for subject in period.subjects
)
)
)
else:
file.write("—")
file.write("</td>")
file.write("</tr>")
file.write("</tbody></table>\n</body>\n</html>\n")
if __name__ == "__main__":
main()
Falls `table` komplett ist, also keine Daten beim Zugriff mehr dynamisch aus dem Web abfragt, könnte man das schreiben der HTML-Datei aus dem ``with``-Block heraus nehmen und sich schneller wieder vom Server abmelden.
Ich persönlich finde das zusammestückeln/stückchenweise schreiben von HTML ja ein bisschen unübersichtlich und damit auch fehleranfällig. Ich würde da eher zu einer Template-Engine wie Jinja2 greifen.