NoPaste

Regexp_in_Python_A2_Untergruppen_statt_sub.py

von tegula

SNIPPET_TEXT:
  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3.  
  4. #' ---
  5. #' title: "Lösungsversuch zum RegEXP-Kurs im Debianforum"
  6. #' author: "tegula"
  7. #' date: "15 06 2022"
  8. #' output: html_document
  9. #' ---
  10.  
  11. #' ------------------------
  12. #' ------------------------
  13.  
  14. #' **Kurs-Teil:** Python (Kurzeinstieg) - Aufgabe Nr. 2
  15. #' **URL:** https://debianforum.de/forum/viewtopic.php?p=1303710#p1303710
  16.  
  17. #' ------------------------
  18. #' ------------------------
  19.  
  20. """
  21. Aufgabe 2)
  22.  
  23. Suche aus einer Forenübersichtsseite alle Threads heraus und gib sie nach dem Erstellungsdatum sortiert aus, im Format Titel; Datum; Threadstarter; Anzahl Antworten.
  24.  
  25. """
  26.  
  27. #' ------------------------
  28. #' ------------------------
  29.  
  30. # Module laden
  31. import requests
  32. import re
  33. import pandas as pd
  34. import argparse
  35.  
  36. #' ------------------------
  37. #' ------------------------
  38.  
  39. # URL der Forenübersichtsseite in Form eines Komandozeilenarguments einlesen
  40. ## Anmerkung: Ich gehe hierbei nach folgender Anleitung vor: https://www.geeksforgeeks.org/command-line-arguments-in-python/#argparse und
  41.  
  42. ## Parse für Komandozeilenargumente initialisieren und Kurzbeschreibung hinzufügen
  43. 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.' )
  44. ## Kurzbeschreibung dieses Skripts hinzufügen
  45.  
  46. ## Komadozeilenoption "url" (Link zur Übersichtsseite) hinzufügen
  47. parser.add_argument('--url', help = 'Die URL einer Übersichtsseite des Debianforums')
  48.  
  49. ## Eingabe einlesen
  50. args = parser.parse_args()
  51. print(args.url)
  52. # Überprüfen, ob es sich tatsächlich, um eine Forenübersichtsseite des Debianforums handelt. Falls Ja: URL einer einer Variablen (dfde_url) abspeichern
  53. ausdruck = re.compile(pattern="https://debianforum\.de/forum/viewforum\.php\?f=\d+")
  54. if ausdruck.search(args.url) != None:
  55.     dfde_url = args.url
  56. else:
  57.     print("\nFehler. URL scheint nicht zu einer dfde-Forenübersichtsseite zu gehörten oder es wurde keine URL angegeben.")
  58.  
  59. #' ------------------------
  60. #' ------------------------
  61.    
  62. # Forenübersichtsseite mit Hilfe des requests-Modul  herunterladen
  63. dfde_forum = requests.get(url=dfde_url).text
  64.  
  65. #' ------------------------
  66. #' ------------------------
  67.  
  68. # Name des Unterforums extrahieren
  69. unterforum = re.search(pattern="<title>(?P<name_unterforum>.*)</title>",
  70.                         string=dfde_forum).group("name_unterforum")
  71.                
  72. # Titel der jeweiligen Threads extrahieren
  73. titel = re.findall(pattern="\"topictitle\">(.*)</a>",
  74.                     string=dfde_forum)
  75.  
  76. # Datum des _ersten_ (ältesten) Beitrags des jeweiligen Thread extrahieren
  77. datum_start = re.findall(pattern="&raquo;\s(.*)",
  78.                     string=dfde_forum)
  79.  
  80. # Datum des _letzten_ (neusten) Beitrags des jeweiligen Threads extrahieren
  81. datum_zuletzt = re.findall(pattern= "<br\s/>(\d{2}\.\d{2}\.\d{4}.*)",
  82.                             string=dfde_forum)
  83.  
  84. # Threadstarter des jeweiligen Threads extrahieren
  85. threadstarter = re.findall(pattern= ">(.*)</a>\s&raquo",
  86.                             string=dfde_forum)
  87.        
  88. # Anzahl der Antworten, die im jeweiligen Threads gepostet wurden, extrahieren
  89. anzahl_antworten = re.findall(pattern= "class=\"posts\">(\d+)",
  90.                             string=dfde_forum)
  91. ## Datentyp korrigieren. IST: Zeichenkette. SOLL: Ganzzahl.
  92. anzahl_antworten = [int(x) for x in anzahl_antworten]
  93.  
  94. #' ------------------------
  95. #' ------------------------
  96.  
  97. # Ausgabe des Ergebnisses vorbereiten
  98. ## DataFrame erstellen
  99. data_dict = {'titel':titel,
  100.               'datum_start':datum_start,
  101.               'datum_zuletzt':datum_zuletzt,
  102.               'threadstarter':threadstarter,
  103.               'anzahl_antworten':anzahl_antworten}
  104. df = pd.DataFrame(data=data_dict)
  105. df['Forum'] = unterforum
  106. df['URL'] = dfde_url
  107. ## Datentyp von datum_start und datum_zuletzt korrigieren. IST: String. SOLL: datetime.
  108. df['datum_start'] =  pd.to_datetime(df['datum_start'],dayfirst=True)
  109. df['datum_zuletzt'] =pd.to_datetime(df['datum_zuletzt'],dayfirst=True)
  110. # DataFrame nach datum_start (Erstellungsdatum des jeweiligen Threads) sortieren (absteigend)
  111. df = df.sort_values(by='datum_start',
  112.                     ascending=False)
  113.  
  114. #' ------------------------
  115. #' ------------------------
  116.  
  117. # Ergebnis ausgeben ausgeben
  118. print(df.to_string())

Quellcode

Hier kannst du den Code kopieren und ihn in deinen bevorzugten Editor einfügen. PASTEBIN_DOWNLOAD_SNIPPET_EXPLAIN