This commit is contained in:
2026-08-19 15:08:39 +03:00
parent 478557f3ad
commit a03c54dbe8
5148 changed files with 31553313 additions and 0 deletions

62
hockey_data/parser.py Normal file
View File

@@ -0,0 +1,62 @@
from __future__ import annotations
from dataclasses import dataclass
from datetime import date
from xml.etree import ElementTree as ET
@dataclass(slots=True)
class ParsedTournament:
external_id: str
level: str
name_ru: str
name_en: str
common_name_ru: str
common_name_en: str
season_part: str
season: str
start_date: date | None
end_date: date | None
round_code: str
game_id_supported: bool
raw_xml: str
def parse_date(value: str | None) -> date | None:
value = str(value or "").strip()
if not value or value == "0000-00-00":
return None
try:
return date.fromisoformat(value)
except ValueError:
return None
def parse_tournaments_xml(content: bytes | str) -> list[ParsedTournament]:
raw = content.encode("utf-8") if isinstance(content, str) else content
root = ET.fromstring(raw)
result: list[ParsedTournament] = []
for node in root.findall(".//Tournament"):
attrs = node.attrib
external_id = str(attrs.get("id") or "").strip()
if not external_id:
continue
result.append(
ParsedTournament(
external_id=external_id,
level=str(attrs.get("level") or "").strip().lower(),
name_ru=str(attrs.get("name") or "").strip(),
name_en=str(attrs.get("nameEn") or "").strip(),
common_name_ru=str(attrs.get("nameCommon") or "").strip(),
common_name_en=str(attrs.get("nameCommonEn") or "").strip(),
season_part=str(attrs.get("seasonPart") or "").strip().lower(),
season=str(attrs.get("season") or "").strip(),
start_date=parse_date(attrs.get("startDate")),
end_date=parse_date(attrs.get("endDate")),
round_code=str(attrs.get("round") or "").strip().lower(),
game_id_supported=str(attrs.get("gameid") or "").lower()
in {"true", "1", "yes"},
raw_xml=ET.tostring(node, encoding="unicode"),
)
)
return result