#!/usr/bin/env python3 # -*- coding: utf-8 -*- #' --- #' title: "Lösungsversuch zum RegEXP-Kurs im Debianforum" #' author: "tegula" #' date: "15 06 2022" #' output: html_document #' --- #' ------------------------ #' ------------------------ #' **Kurs-Teil:** Python (Kurzeinstieg) - Aufgabe Nr. 2 #' **URL:** https://debianforum.de/forum/viewtopic.php?p=1303710#p1303710 #' ------------------------ #' ------------------------ """ Aufgabe 2) Suche aus einer Forenübersichtsseite alle Threads heraus und gib sie nach dem Erstellungsdatum sortiert aus, im Format Titel; Datum; Threadstarter; Anzahl Antworten. """ #' ------------------------ #' ------------------------ # Module laden import requests import re import pandas as pd import argparse #' ------------------------ #' ------------------------ # URL der Forenübersichtsseite in Form eines Komandozeilenarguments einlesen ## Anmerkung: Ich gehe hierbei nach folgender Anleitung vor: https://www.geeksforgeeks.org/command-line-arguments-in-python/#argparse und ## Parse für Komandozeilenargumente initialisieren und Kurzbeschreibung hinzufügen parser = argparse.ArgumentParser(description='Nimmt die URL einer Forenübersichtsseite des Webforums debianforum.de (dfde) entgegen. Gibt folgende Informationen zu dieser Forenübersichtsseite auf der Standardausgabe aus.' ) ## Kurzbeschreibung dieses Skripts hinzufügen ## Komadozeilenoption "url" (Link zur Übersichtsseite) hinzufügen parser.add_argument('--url', help = 'Die URL einer Übersichtsseite des Debianforums') ## Eingabe einlesen args = parser.parse_args() print(args.url) # Überprüfen, ob es sich tatsächlich, um eine Forenübersichtsseite des Debianforums handelt. Falls Ja: URL einer einer Variablen (dfde_url) abspeichern ausdruck = re.compile(pattern="https://debianforum\.de/forum/viewforum\.php\?f=\d+") if ausdruck.search(args.url) != None: dfde_url = args.url else: print("\nFehler. URL scheint nicht zu einer dfde-Forenübersichtsseite zu gehörten oder es wurde keine URL angegeben.") #' ------------------------ #' ------------------------ # Forenübersichtsseite mit Hilfe des requests-Modul herunterladen dfde_forum = requests.get(url=dfde_url).text #' ------------------------ #' ------------------------ # Name des Unterforums extrahieren unterforum = re.search(pattern="(?P<name_unterforum>.*)", string=dfde_forum).group("name_unterforum") # Titel der jeweiligen Threads extrahieren titel = re.findall(pattern="\"topictitle\">(.*)", string=dfde_forum) # Datum des _ersten_ (ältesten) Beitrags des jeweiligen Thread extrahieren datum_start = re.findall(pattern="»\s(.*)", string=dfde_forum) # Datum des _letzten_ (neusten) Beitrags des jeweiligen Threads extrahieren datum_zuletzt = re.findall(pattern= "(\d{2}\.\d{2}\.\d{4}.*)", string=dfde_forum) # Threadstarter des jeweiligen Threads extrahieren threadstarter = re.findall(pattern= ">(.*)\s»", string=dfde_forum) # Anzahl der Antworten, die im jeweiligen Threads gepostet wurden, extrahieren anzahl_antworten = re.findall(pattern= "class=\"posts\">(\d+)", string=dfde_forum) ## Datentyp korrigieren. IST: Zeichenkette. SOLL: Ganzzahl. anzahl_antworten = [int(x) for x in anzahl_antworten] #' ------------------------ #' ------------------------ # Ausgabe des Ergebnisses vorbereiten ## DataFrame erstellen data_dict = {'titel':titel, 'datum_start':datum_start, 'datum_zuletzt':datum_zuletzt, 'threadstarter':threadstarter, 'anzahl_antworten':anzahl_antworten} df = pd.DataFrame(data=data_dict) df['Forum'] = unterforum df['URL'] = dfde_url ## Datentyp von datum_start und datum_zuletzt korrigieren. IST: String. SOLL: datetime. df['datum_start'] = pd.to_datetime(df['datum_start'],dayfirst=True) df['datum_zuletzt'] =pd.to_datetime(df['datum_zuletzt'],dayfirst=True) # DataFrame nach datum_start (Erstellungsdatum des jeweiligen Threads) sortieren (absteigend) df = df.sort_values(by='datum_start', ascending=False) #' ------------------------ #' ------------------------ # Ergebnis ausgeben ausgeben print(df.to_string())