import requests from bs4 import BeautifulSoup from typing import List, Dict BASE_URL = 'https://swrailway.gov.ua/timetable/eltrain/?rid=2' LOCAL_HTML = 'rozklad.html' # Індекс днів тижня: понеділок=0, ..., неділя=6 DAY_INDEX = { 'пн': 0, 'вт': 1, 'ср': 2, 'чт': 3, 'пт': 4, 'сб': 5, 'нд': 6 } def parse_days(text: str) -> str: """Перетворює текст днів курсування на бінарний рядок довжиною 7.""" text = text.lower().strip() if 'щоденно' in text: return '1111111' if text.startswith('крім'): days_part = text.split('крім', 1)[1] days = [d.strip(' .') for d in days_part.split(',')] mask = [1] * 7 for d in days: idx = DAY_INDEX.get(d) if idx is not None: mask[idx] = 0 return ''.join(str(b) for b in mask) if text.startswith('по'): days_part = text.split('по', 1)[1] days = [d.strip(' .') for d in days_part.split(',')] mask = [0] * 7 for d in days: idx = DAY_INDEX.get(d) if idx is not None: mask[idx] = 1 return ''.join(str(b) for b in mask) return '1111111' def fetch_schedule(use_local: bool = False) -> List[Dict]: """ Повертає список поїздів зі станціями, часами і маршрутом для кожного потяга. """ # Завантаження HTML if use_local: with open(LOCAL_HTML, 'r', encoding='utf-8') as f: html = f.read() else: resp = requests.get(BASE_URL, timeout=10) resp.raise_for_status() html = resp.text soup = BeautifulSoup(html, 'html.parser') # Таблиця з часами руху times_table = soup.select_one('div#tabs-trains1 table.td_center') if not times_table: raise RuntimeError('Не знайдено таблицю розкладу') # Маршрути: кожен