optimized

This commit is contained in:
Norbert
2026-03-07 09:23:52 +01:00
parent d343a36b97
commit 8efbace2ec
4 changed files with 420 additions and 82 deletions

View File

@@ -0,0 +1,346 @@
import requests
import re
from bs4 import BeautifulSoup
#from hallen import *
NameTabelle=0
Alias=1
KürzelLiga=2
Shortname=3
LigaLink=4
TeamLink=5
#team = [[0 for x in range(5)] for y in range(12)]
team = []
team.append(["Eschweiler SG","1. Herren","VL M", "H1", "https://hnr-handball.liga.nu/cgi-bin/WebObjects/nuLigaHBDE.woa/wa/groupPage?championship=HNR+25%2F26&group=423989","https://hnr-handball.liga.nu/cgi-bin/WebObjects/nuLigaHBDE.woa/wa/teamPortrait?teamtable=2106481&pageState=vorrunde&championship=HNR+25%2F26&group=423989"])
team.append(["Eschweiler SG II","2. Herren","ROL M", "H2", "https://hnr-handball.liga.nu/cgi-bin/WebObjects/nuLigaHBDE.woa/wa/groupPage?championship=AD+25%2F26&group=424090","https://hnr-handball.liga.nu/cgi-bin/WebObjects/nuLigaHBDE.woa/wa/teamPortrait?teamtable=2102102&pageState=vorrunde&championship=AD+25%2F26&group=424090"])
team.append(["Eschweiler SG III","3. Herren","RL M", "H3", "https://hnr-handball.liga.nu/cgi-bin/WebObjects/nuLigaHBDE.woa/wa/groupPage?championship=AD+25%2F26&group=424285", "https://hnr-handball.liga.nu/cgi-bin/WebObjects/nuLigaHBDE.woa/wa/teamPortrait?teamtable=2105342&pageState=vorrunde&championship=AD+25%2F26&group=424285"])
team.append(["Eschweiler SG IV","4. Herren","RK M", "H4", "https://hnr-handball.liga.nu/cgi-bin/WebObjects/nuLigaHBDE.woa/wa/groupPage?championship=AD+25%2F26&group=424285", "https://hnr-handball.liga.nu/cgi-bin/WebObjects/nuLigaHBDE.woa/wa/teamPortrait?teamtable=2105340&pageState=vorrunde&championship=AD+25%2F26&group=424285"])
#team.append(["Eschweiler SG V","5. Herren","RK M", "H5", "", ""])
team.append(["Eschweiler SG", "1. Damen","ROL F", "D1", "https://hnr-handball.liga.nu/cgi-bin/WebObjects/nuLigaHBDE.woa/wa/groupPage?championship=AD+25%2F26&group=424164", "https://hnr-handball.liga.nu/cgi-bin/WebObjects/nuLigaHBDE.woa/wa/teamPortrait?teamtable=2110804&pageState=vorrunde&championship=AD+25%2F26&group=424164"])
team.append(["Eschweiler SG II", "2. Damen","RL F", "D2", "https://hnr-handball.liga.nu/cgi-bin/WebObjects/nuLigaHBDE.woa/wa/groupPage?championship=AD+25%2F26&group=424341", "https://hnr-handball.liga.nu/cgi-bin/WebObjects/nuLigaHBDE.woa/wa/teamPortrait?teamtable=2110809&pageState=vorrunde&championship=AD+25%2F26&group=424341"])
#team.append(["Eschweiler SG", "mA-Jugend", "OLNR MJA", "mA", "https://hvmittelrhein-handball.liga.nu/cgi-bin/WebObjects/nuLigaHBDE.woa/wa/groupPage?championship=RLNR+22%2F23&group=304425","https://hvmittelrhein-handball.liga.nu/cgi-bin/WebObjects/nuLigaHBDE.woa/wa/teamPortrait?teamtable=1822430&pageState=vorrunde&championship=RLNR+22%2F23&group=304425"]
team.append(["Eschweiler SG", "mB-Jugend", "ROL MJB", "mB", "https://hnr-handball.liga.nu/cgi-bin/WebObjects/nuLigaHBDE.woa/wa/groupPage?championship=AD+25%2F26&group=424304", "https://hnr-handball.liga.nu/cgi-bin/WebObjects/nuLigaHBDE.woa/wa/teamPortrait?teamtable=2106066&pageState=vorrunde&championship=AD+25%2F26&group=424304"])
#team.append(["Eschweiler SG", "wB-Jugend", "ROL WJB", "wB", "", ""])
team.append(["Eschweiler SG", "mC-Jugend", "ROL MJC", "mC", "https://hnr-handball.liga.nu/cgi-bin/WebObjects/nuLigaHBDE.woa/wa/groupPage?championship=AD+25%2F26&group=424048", "https://hnr-handball.liga.nu/cgi-bin/WebObjects/nuLigaHBDE.woa/wa/teamPortrait?teamtable=2107124&pageState=vorrunde&championship=AD+25%2F26&group=424048"])
team.append(["Eschweiler SG II", "mC-Jugend II", "RL MJC", "mC2", "https://hnr-handball.liga.nu/cgi-bin/WebObjects/nuLigaHBDE.woa/wa/groupPage?championship=AD+25%2F26&group=424095", "https://hnr-handball.liga.nu/cgi-bin/WebObjects/nuLigaHBDE.woa/wa/teamPortrait?teamtable=2107128&pageState=vorrunde&championship=AD+25%2F26&group=424095"])
#team.append(["Eschweiler SG", "wC-Jugend", "KL WJC", "wC", "https://hnr-handball.liga.nu/cgi-bin/WebObjects/nuLigaHBDE.woa/wa/groupPage?championship=AD+23%2F24&group=332524", ""])
team.append(["Eschweiler SG", "gD-Jugend", "ROL gJD", "gJD", "https://hnr-handball.liga.nu/cgi-bin/WebObjects/nuLigaHBDE.woa/wa/groupPage?championship=AD+25%2F26&group=424295", "https://hnr-handball.liga.nu/cgi-bin/WebObjects/nuLigaHBDE.woa/wa/teamPortrait?teamtable=2118271&pageState=vorrunde&championship=AD+25%2F26&group=424295"])
team.append(["Eschweiler SG II", "gD-Jugend II", "ROL gJD", "gJD2", "https://hnr-handball.liga.nu/cgi-bin/WebObjects/nuLigaHBDE.woa/wa/groupPage?championship=AD+25%2F26&group=450985", "https://hnr-handball.liga.nu/cgi-bin/WebObjects/nuLigaHBDE.woa/wa/teamPortrait?teamtable=2118273&pageState=vorrunde&championship=AD+25%2F26&group=450985"])
#team.append(["Eschweiler SG", "wD-Jugend", "ROL WJD", "wD", "", ""])
team.append(["Eschweiler SG", "gE-Jugend", "ROL gJE", "gJE", "https://hnr-handball.liga.nu/cgi-bin/WebObjects/nuLigaHBDE.woa/wa/groupPage?championship=AD+25%2F26&group=424179", "https://hnr-handball.liga.nu/cgi-bin/WebObjects/nuLigaHBDE.woa/wa/teamPortrait?teamtable=2118337&pageState=vorrunde&championship=AD+25%2F26&group=424179"])
team.append(["Eschweiler SG II", "gE-Jugend II", "RL gJE", "gJE2", "https://hnr-handball.liga.nu/cgi-bin/WebObjects/nuLigaHBDE.woa/wa/groupPage?championship=AD+25%2F26&group=424147", "https://hnr-handball.liga.nu/cgi-bin/WebObjects/nuLigaHBDE.woa/wa/teamPortrait?teamtable=2118343&pageState=vorrunde&championship=AD+25%2F26&group=424147"])
team.append(["Eschweiler SG III", "gE-Jugend III", "1.RK gJE", "gJE3", "https://hnr-handball.liga.nu/cgi-bin/WebObjects/nuLigaHBDE.woa/wa/groupPage?championship=AD+25%2F26&group=444505", "https://hnr-handball.liga.nu/cgi-bin/WebObjects/nuLigaHBDE.woa/wa/teamPortrait?teamtable=2118359&pageState=vorrunde&championship=AD+25%2F26&group=444505"])
#team.append(["Eschweiler SG", "F-Jugend", "ROL gJF", "F", "https://hnr-handball.liga.nu/cgi-bin/WebObjects/nuLigaHBDE.woa/wa/groupPage?championship=AD+25%2F26&group=424334", "https://hnr-handball.liga.nu/cgi-bin/WebObjects/nuLigaHBDE.woa/wa/teamPortrait?teamtable=2122602&pageState=vorrunde&championship=AD+25%2F26&group=424334"])
#team.append(["Eschweiler SG II", "F-Jugend II", "RL gJF", "F", "https://hnr-handball.liga.nu/cgi-bin/WebObjects/nuLigaHBDE.woa/wa/groupPage?championship=AD+25%2F26&group=452865", "https://hnr-handball.liga.nu/cgi-bin/WebObjects/nuLigaHBDE.woa/wa/teamPortrait?teamtable=2122619&pageState=vorrunde&championship=AD+25%2F26&group=452865"])
#team.append(["Eschweiler SG II", "F-Jugend III", "1.RK gJF", "F", "https://hnr-handball.liga.nu/cgi-bin/WebObjects/nuLigaHBDE.woa/wa/groupPage?championship=AD+25%2F26&group=452867", "https://hnr-handball.liga.nu/cgi-bin/WebObjects/nuLigaHBDE.woa/wa/teamPortrait?teamtable=2122632&pageState=vorrunde&championship=AD+25%2F26&group=452867"])
#hallen = [[0 for x in range(2)] for y in range(71)]
hallen = []
hallen.append(["02001", "AC2"])
hallen.append(["02002", "AC1"])
hallen.append(["02003", "AC1A"])
hallen.append(["02005", "AC3"])
hallen.append(["02006", "AC4"])
hallen.append(["02007", "M2"])
hallen.append(["02012", "W1"])
hallen.append(["02014", "W3"])
hallen.append(["02018", "R"])
hallen.append(["02019", "ST1"])
hallen.append(["02020", "ST2"])
hallen.append(["02022", "E1"])
hallen.append(["02023", "E2"])
hallen.append(["02029", "KSPH"])
hallen.append(["02030", "BIRK"])
hallen.append(["02031", "GÜRZ"])
hallen.append(["02034", "NIE Gesamtschule"])
hallen.append(["02035", "JÜL Schulzentrum"])
hallen.append(["02036", "JÜL/B Berufsschule"])
hallen.append(["02039", "A1 Gesamtschule"])
hallen.append(["02042", "S1 Am Weiher"])
hallen.append(["02044", "ÜP1 Barbarastrasse"])
hallen.append(["02048", "EY Eynatten/B"])
hallen.append(["02050", "AC7 Bergische Gasse"])
hallen.append(["02051", "LIN/B Bendenweg"])
hallen.append(["02061", "E5 Berufsschule"])
hallen.append(["02062", "R1 Rosentalstrasse 38a"])
hallen.append(["2106", "Tann."])
hallen.append(["2110", "Ringstr."])
hallen.append(["2115", "Königswinter"])
hallen.append(["2118", "Neuenhof"])
hallen.append(["2123", "Niederpleis II"])
hallen.append(["2124", "Hennef West"])
hallen.append(["2126", "Gymn."])
hallen.append(["2138", "Marienschule EU"])
hallen.append(["2140", "Eusk."])
hallen.append(["2145", "Heimer."])
hallen.append(["2147", "Hauptschule Kall"])
hallen.append(["2154", "Bertold-Brecht-Gesamtschule"])
hallen.append(["2155", "Oberpl."])
hallen.append(['02013', 'W2 Krottstrasse'])
hallen.append(['1170', 'E6 Bergrath'])
hallen.append(['4112', 'Bergn.'])
hallen.append(['3161', 'BergGl.'])
hallen.append(['4122', 'Vossbr.'])
hallen.append(['2112', 'Beuel'])
hallen.append(['4104', 'GWN'])
hallen.append(['4101', 'Nut.'])
hallen.append(['3117', 'Pulh.'])
hallen.append(['2122', 'Nieder'])
hallen.append(['2131', 'Rund.'])
hallen.append(['02025', 'E4'])
hallen.append(['4120', 'SpH DBG'])
hallen.append(['4106', 'Eugen.'])
hallen.append(['3109', 'Europ.'])
hallen.append(['02024', 'E3'])
hallen.append(["5025", "GHZ2"])
hallen.append(["4231", "Mühlh."])
hallen.append(["3431", "Haan"])
hallen.append(["7011", "Mönch."])
hallen.append(["3152", "Wahn"])
hallen.append(["3137", "Bockl."])
hallen.append(["4112", "Bergn."])
hallen.append(["3142", "Europ."])
hallen.append(["3154", "Rheind."])
hallen.append(["4114", "Marien."])
hallen.append(["2114", "Rheinb."])
hallen.append(["1133", "Lange."])
hallen.append(["6801", "Kerken"])
hallen.append(["6904", "Lank"])
hallen.append(["2142", "HGH BM"])
hallen.append(["03043", "Zülp. I"])
hallen.append(["03039", "Kuch."])
hallen.append(["03044", "Heim."])
hallen.append(["06012", "FBH"])
hallen.append(["06078", "Nipp."])
hallen.append(["07002", "Scharf."])
hallen.append(["08035", "Hilfarth"])
hallen.append(["02049", "LAII"])
hallen.append(["02046", "R1"])
hallen.append(["06051", "Wahn"])
hallen.append(["06024", "Wess."])
hallen.append(["06076", "BTV SZ."])
hallen.append(["06034", "Bicken."])
link_nächsteSpiele = "https://hnr-handball.liga.nu/cgi-bin/WebObjects/nuLigaHBDE.woa/wa/clubMeetings?searchType=0&searchTimeRange=5&searchTimeRangeFrom=&searchTimeRangeTo=&selectedTeamId=WONoSelectionString&club=74726&searchMeetings=Suchen"
REQUEST_TIMEOUT = 20
REQUEST_SESSION = requests.Session()
WHITESPACE_RE = re.compile(r"(\s{2,})")
POKAL_RE = re.compile(r".\-(\w*)\s.*Jgd")
LEAGUE_CLASS_RE = re.compile(
r"\b(Regionalliga|Regionsoberliga|Regionsliga|Verbandsliga|Oberliga|Landesliga|"
r"Bezirksliga|Kreisliga|Kreisliga|Kreisklasse)(?:\s+\d+)?\b",
re.IGNORECASE,
)
REGION_SEASON_PREFIX_RE = re.compile(
r"^[A-Za-zÄÖÜäöüß]+(?:/[A-Za-zÄÖÜäöüß]+)+\s+\d{4}/\d{2}\s*",
re.IGNORECASE,
)
def halle(nummer):
for x in range(len(hallen)):
if str(nummer)==hallen[x][0]:
answer = re.split(r'\s+',hallen[x][1])[0]
break
else:
answer = nummer
return(answer)
def tabelle(team):
#print(team[Alias] +' '+ team[LigaLink])
data = fetch_table(team[LigaLink], 0)
return [row[1:10] for row in data]
def getliga(team):
soup = fetch_soup(team[LigaLink])
abschnitt = soup.find(id="content-col1")
if abschnitt is None:
return ""
text = abschnitt.get_text(" ", strip=True)
text = re.split(r"\bBemerkungen?\b", text, maxsplit=1, flags=re.IGNORECASE)[0].strip()
text = re.split(r"\bTabelle\s+und\s+Spielplan\b", text, maxsplit=1, flags=re.IGNORECASE)[0].strip()
text = REGION_SEASON_PREFIX_RE.sub("", text).strip()
match = LEAGUE_CLASS_RE.search(text)
if match:
name = match.group(0)
else:
# Fallback: only first compact chunk, never full text block.
name = re.split(r"\s{2,}| - | \| ", text, maxsplit=1)[0].strip()
name=re.sub(r"m[ABCDEF]-Jugend", '', name)
name=name.replace(' Männer','')
name=name.replace(' Frauen','')
name=re.sub(r"\w\-Jugend", '', name)
name=re.sub(r"Jugend\sB", '', name)
name=re.sub(r"(männliche)|(weibliche)", '', name)
name=re.sub(r"[mw][ABCDEF]\s", '', name)
name=name.replace(' Spielform','')
#print(name)
return(name)
def teamspielplan(team):
data = fetch_table(team[TeamLink], 1)
return [row[0:8] for row in data]
def Teamspielplan_kuerzen(Mannschaft):
#if "Eschweiler" in Mannschaft:
# Mannschaft ='\\textbf{'+Mannschaft+'}'
if "Borussia Brand (o.W.)" in Mannschaft:
Mannschaft="Bor. Brand (o.W.)"
if "VfR Übach-Palenberg (o.W.)" in Mannschaft:
Mannschaft="Übach-Palenberg (oW)"
if "Schwarz-Rot Aachen (o.W.)" in Mannschaft:
Mannschaft="SR Aachen(o.W.)"
if "SSV Nümbrecht Handball II" in Mannschaft:
Mannschaft="SSV Nümbrecht II"
if "HSG Marienheide/Müllenbach" in Mannschaft:
Mannschaft="HSG Marienheide/Mb"
if "HSG Geislar-Oberkassel" in Mannschaft:
Mannschaft="Geislar-Oberkassel"
if "HBD Löwen Oberberg II" in Mannschaft:
Mannschaft="HBD Oberberg II"
if "JSG Hiesfeld/Aldenrade" in Mannschaft:
Mannschaft="JSG Hiesfeld/Alden."
if "VfR Übach-Palenberg (a.K.)" in Mannschaft:
Mannschaft="VfR Übach-Palenberg a.K."
if "VfR Übach-Palenberg Handball e.V." in Mannschaft:
Mannschaft="VfR Übach-Palenberg"
if "ASV Rurtal Hückelhoven" in Mannschaft:
Mannschaft="ASV Rurtal"
if "HSG Merkstein / Bardenberg III" in Mannschaft:
Mannschaft="HSG Merk./Barden. III"
if "HSG Merkstein / Bardenberg IV" in Mannschaft:
Mannschaft="HSG Merk./Barden. IV"
if "JSG Bardenberg / Merkstein" in Mannschaft:
Mannschaft="JSG Bardenb./Merk."
return(Mannschaft)
def fetch_table(Link, nummer):
soup = fetch_soup(Link)
tables = soup.find_all('table', attrs={'class':'result-set'})
if nummer >= len(tables):
return []
table = tables[nummer]
rows = table.find_all('tr')
if not rows:
return []
header_cells = rows[0].find_all(['th', 'td'])
header = [cell.text.strip().lower() for cell in header_cells]
skip_indices = {index for index, title in enumerate(header) if "bemerkung" in title}
data = []
for row in rows[1:]:
cols = [ele.text.strip() for ele in row.find_all('td')]
if skip_indices:
cols = [value for index, value in enumerate(cols) if index not in skip_indices]
data.append(cols)
return(data)
def fetch_soup(link):
try:
response = REQUEST_SESSION.get(link, timeout=REQUEST_TIMEOUT)
except requests.RequestException:
print(link)
return BeautifulSoup("", 'html.parser')
Fi = str(response.content.decode('utf-8', 'ignore'))
Fi_cleaned = WHITESPACE_RE.sub(' ', str(Fi))
return BeautifulSoup(Fi_cleaned, 'html.parser')
def naechsteSpiele(number):
data=fetch_table(link_nächsteSpiele,0)
for x in range(len(data)):
data[x]=data[x][0:8]
CTR = 0
for x in range(len(data)):
if data[x][0] != '':
CTR+=1
if CTR == number:
break
tabelle=data[:x]
for x in range(len(tabelle)):
if tabelle[x][3] != '':
tabelle[x][3]=halle(tabelle[x][3])
for x in range(len(tabelle)):
match=list(filter(lambda y:y[KürzelLiga]==tabelle[x][5], team))
if match != []:
#Zwei Mannschaften in einer Liga
if (tabelle[x][5]=="KK 2 M"):
if (tabelle[x][6] =="Eschweiler SG IV"):
tabelle[x][6] = '\\textbf{4.Herren}'
elif (tabelle[x][7] =="Eschweiler SG IV"):
tabelle[x][7] = '\\textbf{4.Herren}'
if (tabelle[x][5]=="KL M"):
if (tabelle[x][6] =="Eschweiler SG II"):
tabelle[x][6] = '\\textbf{2.Herren}'
elif (tabelle[x][7] =="Eschweiler SG II"):
tabelle[x][7] = '\\textbf{2.Herren}'
if tabelle[x][6].startswith('Eschweiler'):
tabelle[x][6]= '\\textbf{' + match[0][Alias] + '}'
elif tabelle[x][7].startswith('Eschweiler'):
tabelle[x][7]= '\\textbf{' + match[0][Alias] + '}'
else:
print(tabelle[x][5])
continue
if (tabelle[x][5]=="FSF"):
if tabelle[x][6].startswith('Eschweiler'):
tabelle[x][6] = '\\textbf{F-Jugend}'
elif tabelle[x][7].startswith('Eschweiler'):
tabelle[x][7] = '\\textbf{F-Jugend}'
if (tabelle[x][5]=="Mi"):
if tabelle[x][6].startswith('Eschweiler'):
tabelle[x][6] = '\\textbf{Minis}'
else:
tabelle[x][7] = '\\textbf{Minis}'
pokal=POKAL_RE.findall(str(tabelle[x][5]))
if (len(pokal) != 0 and tabelle[x][6] !="spielfrei" and tabelle[x][7] !="spielfrei"):
#print('POKAL!!!', pokal)
parse=re.compile(r"\sSG\s(I.*)")
#print(tabelle[x][5], tabelle[x][6], tabelle[x][7])
if tabelle[x][6].startswith('Eschweiler'):
#print("erl.: ", str(pokal[0][0]), " ", str(pokal[0][1]))
nummer=parse.findall(str(tabelle[x][6]))
if len(nummer) == 0:
nummer = 'I'
else:
nummer=nummer[0]
#print('Nummer', nummer)
if pokal[0][1] == 'M':
nummer=len(nummer)-1
tabelle[x][6] = "\\textbf{Pokal "+ team[nummer][Alias]+"}"
elif pokal[0][1] == 'F':
tabelle[x][6] = "\\textbf{Pokal Damen}"
else:
tabelle[x][6] = "\\textbf{"+ tabelle[x][5]+"}"
if tabelle[x][7].startswith('Eschweiler'):
nummer=parse.findall(str(tabelle[x][7]))
#print('Nummer', nummer)
if pokal[0][1] == 'M':
nummer=len(nummer)-1
tabelle[x][6] = "\\textbf{Pokal "+ team[nummer][Alias]+"}"
elif pokal[0][1] == 'F':
tabelle[x][7] = "\\textbf{Damen Pokal}"
else:
tabelle[x][7] = "\\textbf{"+ tabelle[x][5]+"}"
tabelle[x][6]=Teamspielplan_kuerzen(tabelle[x][6])
tabelle[x][7]=Teamspielplan_kuerzen(tabelle[x][7])
tabelle = [x for x in tabelle if x[0] != 'Termin offen']
last_date=''
for x in range(len(tabelle)):
if x == 0:
last_date=tabelle[x][1]
else:
if tabelle[x][1] == '':
#print('cont')
continue
else:
if tabelle[x][1] == last_date:
tabelle[x][0] = ''
tabelle[x][1] = ''
else:
last_date = tabelle[x][1]
#print(last_date)
return(tabelle)

140
ids.py
View File

@@ -1,8 +1,6 @@
import requests import requests
import re import re
from bs4 import BeautifulSoup from bs4 import BeautifulSoup
import pandas as pd
import numpy as np
#from hallen import * #from hallen import *
NameTabelle=0 NameTabelle=0
Alias=1 Alias=1
@@ -125,6 +123,19 @@ hallen.append(["06034", "Bicken."])
link_nächsteSpiele = "https://hnr-handball.liga.nu/cgi-bin/WebObjects/nuLigaHBDE.woa/wa/clubMeetings?searchType=0&searchTimeRange=5&searchTimeRangeFrom=&searchTimeRangeTo=&selectedTeamId=WONoSelectionString&club=74726&searchMeetings=Suchen" link_nächsteSpiele = "https://hnr-handball.liga.nu/cgi-bin/WebObjects/nuLigaHBDE.woa/wa/clubMeetings?searchType=0&searchTimeRange=5&searchTimeRangeFrom=&searchTimeRangeTo=&selectedTeamId=WONoSelectionString&club=74726&searchMeetings=Suchen"
REQUEST_TIMEOUT = 20
REQUEST_SESSION = requests.Session()
WHITESPACE_RE = re.compile(r"(\s{2,})")
POKAL_RE = re.compile(r".\-(\w*)\s.*Jgd")
LEAGUE_CLASS_RE = re.compile(
r"\b(Regionalliga|Regionsoberliga|Regionsliga|Verbandsliga|Oberliga|Landesliga|"
r"Bezirksliga|Kreisliga|Kreisliga|Kreisklasse)(?:\s+\d+)?\b",
re.IGNORECASE,
)
REGION_SEASON_PREFIX_RE = re.compile(
r"^[A-Za-zÄÖÜäöüß]+(?:/[A-Za-zÄÖÜäöüß]+)+\s+\d{4}/\d{2}\s*",
re.IGNORECASE,
)
def halle(nummer): def halle(nummer):
for x in range(len(hallen)): for x in range(len(hallen)):
@@ -137,29 +148,27 @@ def halle(nummer):
def tabelle(team): def tabelle(team):
#print(team[Alias] +' '+ team[LigaLink]) #print(team[Alias] +' '+ team[LigaLink])
data=fetch_table(team[LigaLink], 0) data = fetch_table(team[LigaLink], 0)
for x in range(len(data)): return [row[1:10] for row in data]
data[x]=data[x][1:10]
return(data)
def getliga(team): def getliga(team):
try: soup = fetch_soup(team[LigaLink])
response = requests.get(team[LigaLink])
except:
print(team)
Fi =str(response.content.decode('utf-8', 'ignore'))
Fi_cleaned = re.sub(r'(\s{2,})',' ',str(Fi))
soup = BeautifulSoup(Fi_cleaned, 'html.parser')
abschnitt = soup.find(id="content-col1") abschnitt = soup.find(id="content-col1")
#print("abschnitt") if abschnitt is None:
#print(abschnitt) return ""
parse=re.compile(r"br\/>\s(.*)\s\<br/>")
name=str(parse.findall(str(abschnitt))[0]) text = abschnitt.get_text(" ", strip=True)
#print("Name") text = re.split(r"\bBemerkungen?\b", text, maxsplit=1, flags=re.IGNORECASE)[0].strip()
#print(name) text = re.split(r"\bTabelle\s+und\s+Spielplan\b", text, maxsplit=1, flags=re.IGNORECASE)[0].strip()
if len(name) > 20: text = REGION_SEASON_PREFIX_RE.sub("", text).strip()
if re.search(r'((.*)\s)\<br/>',str(name)) is not None:
name=re.search(r'((.*)\s)\<br/>',str(name)).group(1) match = LEAGUE_CLASS_RE.search(text)
if match:
name = match.group(0)
else:
# Fallback: only first compact chunk, never full text block.
name = re.split(r"\s{2,}| - | \| ", text, maxsplit=1)[0].strip()
name=re.sub(r"m[ABCDEF]-Jugend", '', name) name=re.sub(r"m[ABCDEF]-Jugend", '', name)
name=name.replace(' Männer','') name=name.replace(' Männer','')
name=name.replace(' Frauen','') name=name.replace(' Frauen','')
@@ -172,27 +181,8 @@ def getliga(team):
return(name) return(name)
def teamspielplan(team): def teamspielplan(team):
data=fetch_table(team[TeamLink],1) data = fetch_table(team[TeamLink], 1)
for x in range(len(data)): return [row[0:8] for row in data]
data[x]=data[x][0:8]
response = requests.get(team[TeamLink])
Fi =str(response.content.decode('utf-8', 'ignore'))
Fi_cleaned = re.sub(r'(\s{2,})',' ',str(Fi))
soup = BeautifulSoup(Fi_cleaned, 'html.parser')
nummern=[]
#print(Fi_cleaned)
#print(soup)
for link in soup.find_all('a'):
#print(link.contents)
try:
if len(link.contents[0]) == 4:
nummern.append(link.contents[0])
except:
pass
del nummern[0]
#for x in range(len(nummern)):
# data[x][3]=halle(nummern[x])
return(data)
def Teamspielplan_kuerzen(Mannschaft): def Teamspielplan_kuerzen(Mannschaft):
#if "Eschweiler" in Mannschaft: #if "Eschweiler" in Mannschaft:
@@ -228,30 +218,40 @@ def Teamspielplan_kuerzen(Mannschaft):
return(Mannschaft) return(Mannschaft)
def fetch_table(Link, nummer): def fetch_table(Link, nummer):
#print(Link) soup = fetch_soup(Link)
try: tables = soup.find_all('table', attrs={'class':'result-set'})
response = requests.get(Link) if nummer >= len(tables):
except: return []
print(Link)
Fi =str(response.content.decode('utf-8', 'ignore')) table = tables[nummer]
Fi_cleaned = re.sub(r'(\s{2,})',' ',str(Fi))
soup = BeautifulSoup(Fi_cleaned, 'html.parser')
data = []
table = soup.find_all('table', attrs={'class':'result-set'})[nummer]
rows = table.find_all('tr') rows = table.find_all('tr')
for row in rows: if not rows:
cols = row.find_all('td') return []
cols = [ele.text.strip() for ele in cols]
data.append([ele for ele in cols]) header_cells = rows[0].find_all(['th', 'td'])
del data[0] header = [cell.text.strip().lower() for cell in header_cells]
skip_indices = {index for index, title in enumerate(header) if "bemerkung" in title}
data = []
for row in rows[1:]:
cols = [ele.text.strip() for ele in row.find_all('td')]
if skip_indices:
cols = [value for index, value in enumerate(cols) if index not in skip_indices]
data.append(cols)
return(data) return(data)
def fetch_soup(link):
try:
response = REQUEST_SESSION.get(link, timeout=REQUEST_TIMEOUT)
except requests.RequestException:
print(link)
return BeautifulSoup("", 'html.parser')
Fi = str(response.content.decode('utf-8', 'ignore'))
Fi_cleaned = WHITESPACE_RE.sub(' ', str(Fi))
return BeautifulSoup(Fi_cleaned, 'html.parser')
def naechsteSpiele(number): def naechsteSpiele(number):
data=fetch_table(link_nächsteSpiele,0) data=fetch_table(link_nächsteSpiele,0)
response = requests.get(link_nächsteSpiele)
Fi =str(response.content.decode('utf-8', 'ignore'))
Fi_cleaned = re.sub(r'(\s{2,})',' ',str(Fi))
soup = BeautifulSoup(Fi_cleaned, 'html.parser')
for x in range(len(data)): for x in range(len(data)):
data[x]=data[x][0:8] data[x]=data[x][0:8]
CTR = 0 CTR = 0
@@ -261,12 +261,6 @@ def naechsteSpiele(number):
if CTR == number: if CTR == number:
break break
tabelle=data[:x] tabelle=data[:x]
links=[]
nummern=[]
#for link in soup.find_all('a'):
# if len(link.contents[0]) == 4:
# nummern.append(link.contents[0])
#del nummern[0]
for x in range(len(tabelle)): for x in range(len(tabelle)):
if tabelle[x][3] != '': if tabelle[x][3] != '':
tabelle[x][3]=halle(tabelle[x][3]) tabelle[x][3]=halle(tabelle[x][3])
@@ -301,9 +295,7 @@ def naechsteSpiele(number):
tabelle[x][6] = '\\textbf{Minis}' tabelle[x][6] = '\\textbf{Minis}'
else: else:
tabelle[x][7] = '\\textbf{Minis}' tabelle[x][7] = '\\textbf{Minis}'
parse=re.compile(r".\-(\w*)\s.*Jgd") pokal=POKAL_RE.findall(str(tabelle[x][5]))
pokal=parse.findall(str(tabelle[x][5]))
print(pokal)
if (len(pokal) != 0 and tabelle[x][6] !="spielfrei" and tabelle[x][7] !="spielfrei"): if (len(pokal) != 0 and tabelle[x][6] !="spielfrei" and tabelle[x][7] !="spielfrei"):
#print('POKAL!!!', pokal) #print('POKAL!!!', pokal)
parse=re.compile(r"\sSG\s(I.*)") parse=re.compile(r"\sSG\s(I.*)")
@@ -346,9 +338,9 @@ def naechsteSpiele(number):
continue continue
else: else:
if tabelle[x][1] == last_date: if tabelle[x][1] == last_date:
tabelle[x][0] =='' tabelle[x][0] = ''
tabelle[x][1] == '' tabelle[x][1] = ''
else: else:
last_date = tabelle[x][1] last_date = tabelle[x][1]
#print(last_date) #print(last_date)
return(tabelle) return(tabelle)

Binary file not shown.

View File

@@ -38,7 +38,7 @@
Link zur liga\end{figure}\end{textblock} Link zur liga\end{figure}\end{textblock}
\begin{center} \begin{center}
\vspace{0cm} \vspace{0cm}
{\scalefont{3}1. Herren}\\\scalefont{2}Verbandsliga Gr. 5\\ {\scalefont{3}1. Herren}\\\scalefont{2}Verbandsliga\\
\vspace{0cm} \vspace{0cm}
\end{center} \end{center}
\rowcolors{2}{gray!25}{white} \rowcolors{2}{gray!25}{white}
@@ -356,7 +356,7 @@ Sa.&21.03.2026&17:00&VfR Übach-Palenberg&\textbf{Eschweiler SG II}&&ÜP1\\
Link zur liga\end{figure}\end{textblock} Link zur liga\end{figure}\end{textblock}
\begin{center} \begin{center}
\vspace{0cm} \vspace{0cm}
{\scalefont{3}mB-Jugend}\\\scalefont{2}Regionsoberliga <br/> Tabelle und Spielplan (Aktuell) </h1> <h2>Bemerkungen</h2> <p>Die Finalturniere finden am Wochenende des 14./15.03.26 statt. Über die Zusammenstellung der Turniere wird Ende des Jahres entschieden. {\scalefont{3}mB-Jugend}\\\scalefont{2}Regionsoberliga\\
\vspace{0cm} \vspace{0cm}
\end{center} \end{center}
\rowcolors{2}{gray!25}{white} \rowcolors{2}{gray!25}{white}
@@ -400,7 +400,7 @@ Di.&10.03.2026&19:00&HSG Münsterbachtal&\textbf{Eschweiler SG}&&AC3\\
Link zur liga\end{figure}\end{textblock} Link zur liga\end{figure}\end{textblock}
\begin{center} \begin{center}
\vspace{0cm} \vspace{0cm}
\vspace{0cm} {\scalefont{3}mC-Jugend}\\\scalefont{2}Regionsoberliga\\
\vspace{0cm} \vspace{0cm}
\end{center} \end{center}
\rowcolors{2}{gray!25}{white} \rowcolors{2}{gray!25}{white}
@@ -443,7 +443,7 @@ Sa.&14.03.2026&11:00&HC Eynatten/Raeren&\textbf{Eschweiler SG}&&EY\\
Link zur liga\end{figure}\end{textblock} Link zur liga\end{figure}\end{textblock}
\begin{center} \begin{center}
\vspace{0cm} \vspace{0cm}
\vspace{0cm} {\scalefont{3}mC-Jugend II}\\\scalefont{2}Regionsliga\\
\vspace{0cm} \vspace{0cm}
\end{center} \end{center}
\rowcolors{2}{gray!25}{white} \rowcolors{2}{gray!25}{white}
@@ -489,7 +489,7 @@ So.&15.03.2026&15:15&\textbf{Eschweiler SG II}&VfR Übach-Palenberg&&E2\\
Link zur liga\end{figure}\end{textblock} Link zur liga\end{figure}\end{textblock}
\begin{center} \begin{center}
\vspace{0cm} \vspace{0cm}
\vspace{0cm} {\scalefont{3}gD-Jugend}\\\scalefont{2}Regionsoberliga\\
\vspace{0cm} \vspace{0cm}
\end{center} \end{center}
\rowcolors{2}{gray!25}{white} \rowcolors{2}{gray!25}{white}
@@ -532,7 +532,7 @@ Sa.&28.02.2026&13:30&SV Eilendorf&\textbf{Eschweiler SG}&23:33&AC3\\
Link zur liga\end{figure}\end{textblock} Link zur liga\end{figure}\end{textblock}
\begin{center} \begin{center}
\vspace{0cm} \vspace{0cm}
\vspace{0cm} {\scalefont{3}gD-Jugend II}\\\scalefont{2}Regionsoberliga\\
\vspace{0cm} \vspace{0cm}
\end{center} \end{center}
\rowcolors{2}{gray!25}{white} \rowcolors{2}{gray!25}{white}
@@ -575,7 +575,7 @@ Sa.&28.02.2026&09:30&HC Eynatten/Raeren&\textbf{Eschweiler SG II}&17:16&EY\\
Link zur liga\end{figure}\end{textblock} Link zur liga\end{figure}\end{textblock}
\begin{center} \begin{center}
\vspace{0cm} \vspace{0cm}
\vspace{0cm} {\scalefont{3}gE-Jugend}\\\scalefont{2}Regionsoberliga\\
\vspace{0cm} \vspace{0cm}
\end{center} \end{center}
\rowcolors{2}{gray!25}{white} \rowcolors{2}{gray!25}{white}
@@ -618,7 +618,7 @@ So.&15.03.2026&09:30&BTB Aachen&\textbf{Eschweiler SG}&&AC2\\
Link zur liga\end{figure}\end{textblock} Link zur liga\end{figure}\end{textblock}
\begin{center} \begin{center}
\vspace{0cm} \vspace{0cm}
\vspace{0cm} {\scalefont{3}gE-Jugend II}\\\scalefont{2}Regionsliga\\
\vspace{0cm} \vspace{0cm}
\end{center} \end{center}
\rowcolors{2}{gray!25}{white} \rowcolors{2}{gray!25}{white}