Daten aus Internetseite auslesen und in einer strukturierten Tabelle in Excel darstellen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Armado
User
Beiträge: 2
Registriert: Freitag 8. Oktober 2021, 23:07

Hallo zusammen,

ich möchte von der Internetseite:

https://www.zvg-portal.de/

alle Daten nach dem ich ich über die Termin suche auf das Bundesland "Hessen" gegangen bin und über die Suche dann die Ergebnisse dargestellt bekomme in Excel in einer übersichtlichen Tabelle dargestellt bekommen.
Somit könnte ich dann die Daten besser sortieren, filtern, etc.

1. Problem ich muss die Seite lokal speichern, da ich den Quellcode nicht angezeigt bekomme. Was kein Problem ist, da ich danach mir den Quellcode anzeigen lassen kann.
2. Ist die Datenstruktur auf der Seite nicht optimal und somit weiß ich nicht weiter.

Habe bereits wie folgt angefangen, aber komme damit auch nicht weiter, bin absoluter Anfänger und benötige Hilfe und würde mich über jede Hilfe freuen:

from bs4 import BeautifulSoup
import requests

city_1 = 'Berlin'
city_2 = 'Leipzig'

soup = BeautifulSoup(open("C:\py.project\\zvs.html", ), "html.parser")
table = soup
rows = table.find_all('tr')

aktenzeichen = rows [1].text.split()
info_1 = aktenzeichen[1]
info_2 = aktenzeichen[2]

print(f'Das Aktenzeichen in {info_1} beträgt {info_2}')

Danke!
Benutzeravatar
sparrow
User
Beiträge: 4540
Registriert: Freitag 17. April 2009, 10:28

Code solltest du immer zwischen Code-Tags posten. Die erscheinen automatisch, wenn du immvollständigen Editor den </> Button drückst.

Deine Fragen sind leider sehr unspezifisch.

Wenn du Daten von einer Seite scrapen willst, nutzt man entweder das externe requests Modul oder(wenn es nicht anders geht) Selenium.

Ansonsten hast du mit bs4vdsd richtige Werkzeug um HTML zu parsen.
Da du aber nicht sagst, was nicht geht, bzw. wie die Informationen aussehen - und auch nicht, was eigentlich nicht geht, wird es schwer dir weiter zu helfen.
rogerb
User
Beiträge: 878
Registriert: Dienstag 26. November 2019, 23:24

@Armado,
Somit könnte ich dann die Daten besser sortieren, filtern, etc.
Das verstehe ich nicht, denn das Formular auf der Seite bietet dir doch genau diese Funktionalität.

Dennoch mal ein Ansatz. Ich hoffe durch die Kommentare ist es selbsterklärend:

Code: Alles auswählen

from bs4 import BeautifulSoup
import requests

# wenn man auf Suche clickt sieht man in der Addresszeile diese url
URL = "https://www.zvg-portal.de/index.php?button=Suchen"


def get_termin_table(bundesland):
    """Gibt die HTML Tabelle mit den Termindaten zurück"""

    # Beim der Abfrage der Daten werden diese Formulardaten an den Server geschickt
    # Das Formular ist im HTML Quelltext sichtbar
    # Der Server wiederum liefert die entsprechenden Daten zurück
    # Man kann natürlich auch andere Werte eintragen um andere Daten zu erhalten
    data = {
        "ger_name": "-- Alle Amtsgerichte --",
        "order_by": "2",
        "land_abk": bundesland,
        "ger_id": "0",
        "az1": "",
        "az2": "",
        "az3": "",
        "az4": "",
        "art": "",
        "obj": "",
        "str": "",
        "hnr": "",
        "plz": "",
        "ort": "",
        "ortsteil": "",
        "vtermin": "",
        "btermin": "",
    }

    # Ein POST-Request als ob man das Formular auf der Seite ausgefüllt hätte
    response = requests.post(URL, data=data)
    soup = BeautifulSoup(response.text, features="html.parser")

    # In der HTML Response des Servers gibt es 6 Tabellen. Die 2. ist die interessante
    return soup.find_all("table")[1]


def main():
    termine = get_termin_table("he") # Termintabelle für Hessen
    row_iterator = iter(termine.find_all("tr"))

    # html Tabelle zeilenweise lesen bis keine Zeilen mehr gefunden werden
    while True:
        try:
            for data_cell in next(row_iterator).find_all("td"):
                # durch alle Zellen einer Zeile iterieren und ausgeben
                print(data_cell)
                # hier muss es eine entsprechende Auswertung geben, die die
                # jeweilige Struktur der Datzen versteht
        except StopIteration:
            # keine Zeile mehr -> Abbruch
            break


if __name__ == "__main__":
    main()
An Stelle der print Funktion musst du jetzt die Daten so auswerten wie du es gerne hättest.
Es gibt viele Fälle die man dabei berücksichtigen muss, da die Daten nicht einheitlich sind.
Benutzeravatar
__blackjack__
User
Beiträge: 14069
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@rogerb: Warum diese komische `iter()`/``while``/``try``/``except``/`next()`-Konstruktion? Das ist doch einfach nur das hier in kompliziert:

Code: Alles auswählen

def main():
    termine = get_termin_table("he")  # Termintabelle für Hessen
    # html Tabelle zeilenweise lesen bis keine Zeilen mehr gefunden werden
    for row_node in termine.find_all("tr"):
        for data_cell in row_node.find_all("td"):
            # durch alle Zellen einer Zeile iterieren und ausgeben
            print(data_cell)
            # hier muss es eine entsprechende Auswertung geben, die die
            # jeweilige Struktur der Datzen versteht
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
rogerb
User
Beiträge: 878
Registriert: Dienstag 26. November 2019, 23:24

@__blackjack__,

es war nur ein Ansatz.
Mehrere aufeinanderfolgende Reihen gehören zu einem Datensatz.
Wenn die Reihenfolge und Anzahl der Einträge in einem Datensatz konstant wäre, könnte man mit next() zum jeweils nächsten weiter springen und diese dann in eine entsprechende Datenstruktur einsortieren.
Die Daten sind aber lückenhaft und nicht gleichmäßig. Es würde also nicht so einfach funktionieren.
Ohne zu wissen welche Daten überhaupt relevant sind und wie sie am Ende strukturiert sein sollen, wollte ich mich aber noch nicht festlegen.
Es kann auch gut sein, dass einfaches Iterieren über die Tabellen-Zellen am Ende gut funktioniert.
Armado
User
Beiträge: 2
Registriert: Freitag 8. Oktober 2021, 23:07

ok bin absolut neu, aber ihr habt mir gut geholfen ich versuche es mal und falls ich noch fragen habe, melde ich mich wieder
Antworten