Wie kann man diese Datei parsen?

Django, Flask, Bottle, WSGI, CGI…
Antworten
Niwla23
User
Beiträge: 10
Registriert: Donnerstag 21. Februar 2019, 17:29

Also ich hab eine Datei, die ich mit BeatifullSoup parse will.

Bild

Das ist die Grundstruktur. So sieht die ganze tabelle auf wurzelebene aus.
Dann gibt es solche Überschrifen von einer von denen(der, wo meine klasse steht brauche ich die unteren Zeilen bis zur nächsten Überschrift) brauche ich die daten.:

Code: Alles auswählen

<tr class="list even"><td class="list inline_header" colspan="6">Klasse  LEHERER</td></tr>

So sieht das dann aus. Das will ich für eine bestimmte Klasse haben (als HTML)
Bild

Hier habe ich unseren Vertreter mal bearbeitet (das da keine Namen stehen): http://niwla23.gitlab.io/download/vertreterdemo.html

Ich hoffe jemand kann mir da helfen. Wie gesagt brauche die zeilen die unter einer klasse stehen als HTML

Viele Grüße, Niwla23
Sirius3
User
Beiträge: 18330
Registriert: Sonntag 21. Oktober 2012, 17:20

Was hast Du denn schon versucht? Die entscheidende Information scheint ja ›inline_header‹ zu sein.
Benutzeravatar
__blackjack__
User
Beiträge: 14238
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Code: Alles auswählen

#!/usr/bin/env python3
import bs4
import prettyprinter
from attr import attrib, attrs
from prettyprinter import pprint

prettyprinter.install_extras(["attrs"])


@attrs(frozen=True)
class Lecture:
    hours = attrib()
    subject = attrib()
    substituted_teacher = attrib()
    text = attrib()
    classes = attrib()
    room = attrib()


def main():
    with open("vertreterdemo.html", "rb") as file:
        soup = bs4.BeautifulSoup(file.read(), "lxml")

    teacher_to_lecture = dict()
    teacher = None
    for row in soup.find("table", "mon_list")("tr"):
        cells = row("td")
        if cells:
            if "inline_header" in cells[0].get("class"):
                teacher = cells[0].text.strip()
                if teacher in teacher_to_lecture:
                    raise ValueError(f"{teacher!r} already seen")
                teacher_to_lecture[teacher] = list()
            else:
                (
                    hours_cell,
                    subject_cell,
                    teacher_cell,
                    text_cell,
                    classes_cell,
                    room_cell,
                ) = cells
                teacher_to_lecture[teacher].append(
                    Lecture(
                        list(map(int, hours_cell.text.split("-"))),
                        subject_cell.text.strip(),
                        teacher_cell.text.strip(),
                        text_cell.text.strip(),
                        classes_cell.text.strip(),
                        room_cell.text.strip(),
                    )
                )
    pprint(teacher_to_lecture)


if __name__ == '__main__':
    main()
“Ich bin für die Todesstrafe. Wer schreckliche Dinge getan hat, muss eine angemessene Strafe bekommen. So lernt er seine Lektion für das nächste Mal.” — Britney Spears, Interview in der französischen Zeitung Libération, 2. April 2002
Antworten