"""Yandex.Недвижимость scraper (realty.yandex.ru). Я.Недвижимость отдаёт SSR HTML с `__INITIAL_STATE__` JSON в `', re.DOTALL, ) def _extract_yandex_state(html: str) -> dict[str, Any] | None: m = _RE_STATE.search(html) if not m: return None raw = m.group(1) # Может начинаться с `window.__INITIAL_STATE__=` префикса raw = re.sub(r'^\s*window\.[\w_]+\s*=\s*', '', raw).rstrip(';').strip() try: return json.loads(raw) except json.JSONDecodeError: return None def _items_from_state(state: dict[str, Any]) -> list[dict[str, Any]]: """Yandex Realty: state.map.offers.points содержит список объявлений (десктоп desktop SSR).""" for path in [ ("map", "offers", "points"), # верифицировано на проде ("search", "offers"), ("offers", "points"), ("offers", "items"), ]: cursor: Any = state for key in path: if not isinstance(cursor, dict): cursor = None break cursor = cursor.get(key) if isinstance(cursor, list) and cursor: return cursor return [] def _map_wall_type(yandex_type: str | None) -> str | None: if not yandex_type: return None mapping = { "PANEL": "panel", "BRICK": "brick", "MONOLITH": "monolith", "MONOLITH_BRICK": "monolith_brick", "BLOCK": "panel", } return mapping.get(yandex_type.upper(), "other")