Nabu Vogelliste als Pandas Dataframe

Die Nabu hält alljährlich eine Gartenvögelzählung ab, bei denen unter anderem private Personen gesichtete Vögel an einem Tag zählen und übermitteln können. Diese Liste stellt die Nabu dann auf deren Internetpräsenz zur Verfügung. Angezeigt wird die Vogelart, die Anzahl, die Vögel pro Garten und ein Vergleich zum Vorjahr. Filtern könnt ihr nach Jahr, Bundesland, Vogelart und Landkreis/Stadt.
Dies vorab als kleine Beschreibung, um was für eine Liste es sich handelt, die wir uns zu eigen machen. Am einfachsten lässt sich die Nabu Vogelliste als Pandas Dataframe darstellen, wenn wir BeautifulSoup benutzen. Mit Hilfe dieser Bibliothek lassen sich XML und HTML Dokumente parsen. Für die Abarbeitung benötigen wir also eine URL, die wir für unseren Get-Request benutzen können. Mitinbegriffen sind in der unten angegebenen URL schon die Filtereinstellungen. So sind nur die Ergebnis für das Jahr 2021 enthalten, die im Bundesland Niedersachsen und dem Ort Emsland(034540000000) vorkommen. Wer die komplette Liste haben möchte oder sich seine eigene URL generieren möchte, kann dies mit diesem Link machen.

https://www.nabu.de/tiere-und-pflanzen/aktionen-und-projekte/stunde-der-gartenvoegel/ergebnisse/15767.html?jahr=2021&bundesland=Niedersachsen&vogelart=&ort=034540000000

In unseren Python Code importieren wir die benötigten Bibliotheken. Eventuell müsst ihr BeautifulSoup noch nachträglich installieren, darauf gehe ich hier nicht weiter drauf ein.

from bs4 import BeautifulSoup
import requests
import pandas as pd

Zuerst holen wir uns das HTML Dokument und initialisieren BeatifulSoup. Danach suchen wir nach einem <tbody> im HTML DOM und gehen die einzelnen Tabellenfelder durch. Das Ergebnis schreiben wir vorerst in eine Liste. Diese brauchen wir später für unseren Dataframe, da wir aus der Liste das Dataframe erzeugen.

tbody = soup.find('tbody')
vogel_df = pd.DataFrame()
vogelliste = list()

for i in tbody:
   
    try:
        vogelliste.append([
            i.find_next('tr').find_next('td').find_next('td').getText(),
            i.find_next('tr').find_next('td').find_next('td').find_next('td').getText(),
            i.find_next('tr').find_next('td').find_next('td').find_next('td').find_next('td').getText(),
            i.find_next('tr').find_next('td').find_next('td').find_next('td').find_next('td').find_next('td').getText(),
            i.find_next('tr').find_next('td').find_next('td').find_next('td').find_next('td').find_next('td').find_next('td').getText(),
            i.find_next('tr').find_next('td').find_next('td').find_next('td').find_next('td').find_next('td').find_next('td').find_next('td').getText()
        ])

    except:
        pass

vogel_df = pd.DataFrame(vogelliste, columns=['Vogelart','Anzahl','Prozent_der_Gärten','Vögel_pro_garten','Vergleich_zum_Vorjahr','Vergleich_zum_Vorjahr(Prozent)'])

Eine Ausgabe des Dataframe würde folgendes ausgeben:

          Vogelart Anzahl Prozent_der_Gärten Vögel_pro_garten Vergleich_zum_Vorjahr Vergleich_zum_Vorjahr(Prozent) 
0     Haussperling   1500             78,79%             5,68                + 0,19                           + 4%  
1            Amsel    885             95,45%             3,35                + 0,21                           + 7%  
2        Kohlmeise    815             85,98%             3,09                + 0,68                          + 28%   
3        Blaumeise    700             81,82%             2,65                + 0,59                          + 28%     
4      Ringeltaube    599             61,74%             2,27                + 0,22                          + 11%  
..             ...    ...                ...              ...                   ...                            ...
79       Sturmmöwe      1              0,38%             0,00                     -                              0
80    Birkenzeisig      1              0,38%             0,00                  0,00                          + 27%   
81      Feldlerche      1              0,38%             0,00                  0,00                          + 27%   
82   Braunkehlchen      1              0,38%             0,00                     -                              0   
83  Waldbaumläufer      1              0,38%             0,00                     -                              0 

Das war es schon, um die Nabu Vogelliste als Pandas Dataframe zu erhalten. Relativ simpel und doch funktionstüchtig.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert