Regexp_in_Python_A2_Untergruppen_statt_sub.py
von tegula- SNIPPET_TEXT:
-
- #!/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="<title>(?P<name_unterforum>.*)</title>",
- string=dfde_forum).group("name_unterforum")
- # Titel der jeweiligen Threads extrahieren
- titel = re.findall(pattern="\"topictitle\">(.*)</a>",
- 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= "<br\s/>(\d{2}\.\d{2}\.\d{4}.*)",
- string=dfde_forum)
- # Threadstarter des jeweiligen Threads extrahieren
- threadstarter = re.findall(pattern= ">(.*)</a>\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())
Quellcode
Hier kannst du den Code kopieren und ihn in deinen bevorzugten Editor einfügen. PASTEBIN_DOWNLOAD_SNIPPET_EXPLAIN