Files
gallery/gismeteo/parser.py
2024-07-25 00:08:34 +03:00

119 lines
3.4 KiB
Python

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}