html untersuchen

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.
Fire Spike
User
Beiträge: 329
Registriert: Montag 13. Mai 2019, 16:05
Wohnort: Erde

Ich will noch den fertigen Code posten. Die Trennlinien passen sich an das Terminal an!

Code: Alles auswählen

from bs4 import BeautifulSoup
from urllib.request import urlopen
import requests
import re
import shutil

terminal_länge, _ = shutil.get_terminal_size()
    
def status_parser():
    webseite = urlopen("https://www.python-forum.de/index.php")
    html = webseite.read().decode()
    soup = BeautifulSoup(html, "html.parser")

    werte = ["Themen insgesamt", "Beiträge insgesamt", "Mitglieder insgesamt", "neuestes Mitglied"]

    ausgabetext = ""
    abtrennung("Forumstatistik")
    for text in werte:
        ausgabetext += text + ": " + soup.find("div", "statistics").p.find(text=re.compile(text)).next.text + "\n"
    
    print(ausgabetext[:-1])

def abtrennung(text):
    print("_" * terminal_länge)
    print(text)
    print("_" * terminal_länge)
    
def online_benutzer_parser():
    with requests.Session() as session:
        benutzerdaten = {"username": "Fire Spike",
                        "password": "blabala",
                        "autologin": "on",
                        "login": "Anmelden"
                         }
        users = []
        aktivitäten = []
        session.post("https://www.python-forum.de/ucp.php?mode=login", data=benutzerdaten)
        html = session.get("https://www.python-forum.de/viewonline.php").text
        soup = BeautifulSoup(html, "html.parser")
        abtrennung("Benutzer die online sind")
        for tag in soup.find("div", "forumbg forumbg-table").table.tbody.find_all("tr"):
            try:
                user = tag.td.a.next
            except AttributeError:
                user = tag.td.span.next
            users.append(user)
        for tag in soup.find("div", "forumbg forumbg-table").table.tbody.find_all("tr"):
            aktivität = tag.contents[3].a.next
            aktivitäten.append(aktivität)
        
        max_länge = len(max(users, key=len))
        for i, a in zip(aktivitäten, users):
            anzahl = int(max_länge + 5 - len(a))
            print(a, " " * anzahl, i)
            
        print(soup.find("div", "page-body").p.next)
                
status_parser()
online_benutzer_parser()
Output:

Code: Alles auswählen

________________________________________________________________________________
Forumstatistik
________________________________________________________________________________
Themen insgesamt: 42187
Beiträge insgesamt: 346902
Mitglieder insgesamt: 17925
neuestes Mitglied: MissMapeL
________________________________________________________________________________
Benutzer die online sind
________________________________________________________________________________
Fire Spike         Betrachtet „Wer ist online?“
Google [Bot]       Liest Thema in Verbesserungsvorschläge
Bing [Bot]         Liest Thema in Webframeworks
linde              Foren-Übersicht
Es ist 1 Gast online
Antworten