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: 17747
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: 13100
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()
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Antworten