-
Notifications
You must be signed in to change notification settings - Fork 0
/
plan.py
144 lines (126 loc) · 8.13 KB
/
plan.py
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
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
from urllib.request import urlopen # Für Download
from bs4 import BeautifulSoup # Zum Parsen
import time # Zum Finden des Jahres einer Vertretung
import json # Zum konvertieren in Json
class updateWeek():
def __init__(self,url,datei,file='data.json'): # 1 Instanz == Eine Url
self.url = url
self.datei = datei
self.file = file
def createUrl(self,week): # Erstellt URL aus self.url, self.datei und angegebener Woche
fullUrl = self.url + str(week) + self.datei
return(fullUrl)
def downloadWeek(self,week): # Downloadet eine Woche
html = urlopen(self.createUrl(week)).read().decode('latin2')
return(html)
def findNone(self,content):
if content == "---" or content == " " or content == "\xa0": # Zeichen, die "Kein Inhalt" bedeuten
return(None) # Durch None ersetzen
else:
return(content) # Wenn Inhalt = gebe wieder Inhalt zurück
def createTime(self,date,title): # Jeder 31.7. liegt in Sommerferien --> < 2. Halb | > 1. Halb
daymonth = time.strptime(date,'%d.%m.') # Fasse Tag & Monat in daymonth zusammen
month = int(time.strftime('%m',daymonth))
currentyear = int(time.strftime('%y')) # currentyear = Aktuelles Jahr
for year in range(currentyear-2,currentyear+1):
if title.count(str(year) + '/' + str(year+1)) > 0 or title.count(str(year) + '/20' + str(year+1)) > 0:
if month <= 7:
return(date + '20' + str(year + 1))
elif month > 7:
return(date + '20' + str(year))
def parseHtml(self,html): # Parsen des Downloads
with open(self.file) as file: # Importiere data.json
data = json.load(file) # Als data
soup = BeautifulSoup(html,"html.parser")
title = soup.title.string
tablesraw = soup.findAll('table')
motd = None
date = None
for table in tablesraw: # Jede Tabelle
if table.get('class') != ['subst']: # Wenn Tabelle keine Vertretungen beinhaltet => motd
motd = table.get_text() # Schreibe Inhalt der Tabelle in motd
motd
motd = motd.replace('\nNachrichten zum Tag\n','')
motdsplit = []
for m in motd:
motdsplit.append(m)
motdsplit.pop()
motd = ""
for m in motdsplit:
motd += m
continue # Aktuelle Tabelle zu Ende bearbeitet --> Abbruch der Verarbeitung
rowsraw = table.findAll('tr') # rowsraw = Liste mit Tabellen-Reihen
if len(rowsraw) == 1: # Wenn Anzahl Reihen = 1, weil keine Vertretungen verfügbar
continue # Abbruch, damit keine unnötigen Informationen in json
vertretungen=[] # Erstelle Liste für die Vertretungen einer Tabellen
for row in rowsraw: # Jede Reihe in der Tabelle
colsraw = row.findAll('td') # colsraw = Liste mit allen Zellen in der Reihe
if len(colsraw)==0: # Wenn Anzahl der Zelle == 0: Abbruch, damit keine leeren Reihen eingetragen werden ('th's)
continue
c = 0 # c = 0, wird durchgezählt um Inhalt Zelle herauszufinden, wird für neue Reihe hiermit resettet
vertretung = {} # dict für einzelene Vertretung
for col in colsraw: # Jede Zelle
if c == 0: # Stunde
stunden = col.string
stunden = stunden.replace("- ","")
stunden = stunden.split()
vertretung["stunden"] = stunden
elif c == 1: # Datum
if self.findNone(col.string) == col.string:
date = col.string
elif c == 2:
vertretung["vertreter"] = self.findNone(col.string)
elif c == 3: # Klasse(n)
klasse = col.string
klasse = klasse.replace(",","")
klasse = klasse.split()
vertretung["klasse"] = klasse
elif c == 4: # Art der Vertretung(Raumvertretung, Entfall, Vertretung)
vertretung["art"] = self.findNone(col.string)
elif c == 5: # Altes Fach
vertretung["fachalt"] = self.findNone(col.string)
elif c == 6: # Neues Fach
vertretung["fach"] = self.findNone(col.string)
elif c == 7: # Dauerhaft leere Spalte -> wird übersprungen
None
elif c == 8: # Text zur Vertretung
vertretung["text"] = self.findNone(col.string)
elif c == 9: # Raum der Vertretung
vertretung["raum"] = self.findNone(col.string)
else: # Sollte c > Anzahl der Spalten werden: Warnung
print("Fehler: c > 9")
c += 1 # c+=1, damit nächste Spalte/Zelle
if vertretung["art"] == None:
#print(vertretungen[-1])
vertretungen[-1]["text"] += " " + vertretung["text"]
continue
vertretungen.append(vertretung) # Nach allen Zellen: Füge Vertretung in Liste Vertretungen zusammen
olddate = date # Altes Datum = Datum, für nächste Runde
daycontent = {"motd":motd,"vertretungen":vertretungen} # Füge Motd und Liste der Vertretungen des Tages in daycontent zusammen
motd = None # Leere motd, damit gleich nicht mehr vorhanden
date = self.createTime(date,title) # Füge mit Funktion date Jahr zum Datum hinzu
data["days"][date] = {} # Leere bisherigen dict zum Datum
data["days"][date] = daycontent # Fülle dict des Datums mit daycontent
with open(self.file,'w') as file: # Öffne data.json
file.write(json.dumps(data,indent=None)) # Speichere in data.json ab, indent = Einrückung (None = Alles eine Zeile)
def update(self,week): # Starten eines Updates einer Woche
html = self.downloadWeek(week)
self.parseHtml(html)
class get():
def __init__(self,file="data.json"):
self.file = file
def search(self,date,isklasse): # Suche nach Vertretungen
with open(self.file) as file: # Importiere data.json
data = json.load(file) # Als data
sortedVertretungen = []
for vertretung in data["days"][date]["vertretungen"]: # Jede Vertretung
for klasse in vertretung["klasse"]: # Jede Klasse
counter = klasse.count(str(isklasse)) # Zähle Anzahl der gesuchten Klasse pro Klasse
if counter > 0: # Wenn Suchbegriff gefunden
sortedVertretungen.append(vertretung) # Füge Vertretung hinzu
break # Breche aktuelle Vertretung ab, da bereits hinzugefügt
return({date:sorted(sortedVertretungen, key=lambda vertretung: vertretung["stunden"][0])})
def motd(self,date):
with open(self.file) as file: # Importiere data.json
data = json.load(file) # Als data
return(data["days"][date]["motd"])