import datetime from typing import Dict, Iterable, List import dateparser from bs4 import Tag from .core import BaseWidgetParser, RowParser class OneDayParser(BaseWidgetParser): SELECT = ".widget.widget-oneday .widget-items" class DateParser(RowParser[datetime.datetime]): KEY = "date" def parse_row(self, tag: Tag) -> Iterable[datetime.datetime]: date_str = ( tag.select_one(".widget-row.widget-row-datetime-date > .row-item") .find(text=True, recursive=False) .text ) date = dateparser.parse(date_str, languages=["ru"]) for item in tag.select(".widget-row.widget-row-datetime-time > .row-item"): time_str = item.text time = dateparser.parse(time_str, languages=["ru"]) time = time.replace(year=date.year, month=date.month, day=date.day) yield time class CloudnessParser(RowParser[str]): KEY = "cloudness" def parse_row(self, tag: Tag) -> Iterable[str]: for item in tag.select(".widget-row[data-row=icon-tooltip] > .row-item"): yield item.attrs["data-tooltip"] class TemperatureParser(RowParser[int]): KEY = "temperature" def parse_row(self, tag: Tag) -> Iterable[int]: for item in tag.select( ".widget-row-chart[data-row=temperature-air] > .chart > .values > .value > temperature-value" ): yield int(item.attrs["value"]) class WindSpeedParser(RowParser[int]): KEY = "wind_speed" def parse_row(self, tag: Tag) -> Iterable[int]: for item in tag.select( ".widget-row[data-row=wind-speed] > .row-item > speed-value" ): yield int(item.attrs["value"]) class WindGustParser(RowParser[int]): KEY = "wind_gust" def parse_row(self, tag: Tag) -> Iterable[int]: for item in tag.select(".widget-row[data-row=wind-gust] > .row-item"): value = item.select_one("speed-value") yield int(value.attrs["value"]) if value else 0 class WindDirectionParser(RowParser[str]): KEY = "wind_direction" def parse_row(self, tag: Tag) -> Iterable[str]: for item in tag.select( ".widget-row[data-row=wind-direction] > .row-item > .direction" ): yield item.text class WindPrecipitationParser(RowParser[float]): KEY = "precipitation" def parse_row(self, tag: Tag) -> Iterable[float]: for item in tag.select( ".widget-row[data-row=precipitation-bars] > .row-item > .item-unit" ): yield float(item.text.replace(",", ".")) class PressureParser(RowParser[int]): KEY = "pressure" def parse_row(self, tag: Tag) -> Iterable[int]: for item in tag.select( ".widget-row-chart[data-row=pressure] > .chart > .values > .value > pressure-value" ): yield int(item.attrs["value"]) class HumidityParser(RowParser[int]): KEY = "humidity" def parse_row(self, tag: Tag) -> Iterable[int]: for item in tag.select(".widget-row[data-row=humidity] > .row-item"): yield int(item.text) ROW_PARSERS: List[RowParser] = [ DateParser(), CloudnessParser(), TemperatureParser(), WindSpeedParser(), WindGustParser(), WindDirectionParser(), WindPrecipitationParser(), PressureParser(), HumidityParser(), ] ROW_PARSERS_MAP: Dict[str, RowParser] = {parser.KEY: parser for parser in ROW_PARSERS}