def parse_webpage(webpage, width = 80, titlesep = "=", tablesep = "-", semesters = None, semesters_from_oldest=True): source = edukacjacl.Source(webpage) data = list(sorted(parse(source), key=lambda kv: kv[1]['semester'])) if not semesters_from_oldest: data = list(reversed(data)) total = { "average": 0.0, "courses": 0, "ects": 0, "weightaverage": 0.0, } for name, tmp in data: year, semester, courses = tmp["year"], tmp["semester"], tmp["courses"] if semesters is not None and semester not in semesters: continue print("{}\nrok: {}\tsemestr: {}".format(name, year, semester)) print("{}".format(width * titlesep)) if len(courses) > 0: print("{}\t\t\t\t{}\t{}".format("NAZWA KURSU", "ECTS", "OCENA")) print("{}".format(width * tablesep)) for course in courses: print("{}\t{}\t{}".format(format_course_title(course[0]), course[1], course[2])) print("{}".format(width * tablesep)) print("Punktów ECTS:\t\t{}".format(sum(map(lambda x: x[1], courses)))) print("Średnia ważona:\t\t{:.3f}".format(average(courses, value = lambda x: x[2], weight = lambda x: x[1]))) print("Średnia arytmetyczna:\t{:.3f}".format(average(courses, value = lambda x: x[2]))) total["average"] += sum(map(lambda x: x[2], courses)) total["courses"] += len(courses) total["ects"] += sum(map(lambda x: x[1], courses)) total["weightaverage"] += sum(map(lambda x: x[1] * x[2], courses)) else: print("Brak danych o kursach!") print() try: total["average"] /= total["courses"] total["weightaverage"] /= total["ects"] except ZeroDivisionError: pass print("Łącznie") print("{}".format(width * titlesep)) print("Odbyto kursów:\t\t{}".format(total["courses"])) print("Punktów ECTS:\t\t{}".format(total["ects"])) print("Średnia ważona:\t\t{:.3f}".format(total["weightaverage"])) print("Średnia arytmetyczna:\t{:.3f}".format(total["average"])) return True
def test_parse_data(self): src = Source(b64decode(consts.source)) self.assertListEqual(parse(src), self.EXPECTED_DATA, "Something went wrong when parsing <= data differs")