Seite 1 von 1

Wie kann man diese Datei parsen?

Verfasst: Montag 28. Oktober 2019, 17:18
von Niwla23
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

Re: Wie kann man diese Datei parsen?

Verfasst: Montag 28. Oktober 2019, 18:52
von Sirius3
Was hast Du denn schon versucht? Die entscheidende Information scheint ja ›inline_header‹ zu sein.

Re: Wie kann man diese Datei parsen?

Verfasst: Sonntag 10. November 2019, 23:20
von __blackjack__

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()