optimized
This commit is contained in:
346
.ipynb_checkpoints/ids-checkpoint.py
Normal file
346
.ipynb_checkpoints/ids-checkpoint.py
Normal 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)
|
||||||
138
ids.py
138
ids.py
@@ -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,8 +338,8 @@ 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)
|
||||||
|
|||||||
BIN
tabelle.pdf
BIN
tabelle.pdf
Binary file not shown.
16
tabelle.tex
16
tabelle.tex
@@ -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}
|
||||||
|
|||||||
Reference in New Issue
Block a user