diff --git a/tradein-mvp/backend/app/services/scrapers/yandex_newbuilding.py b/tradein-mvp/backend/app/services/scrapers/yandex_newbuilding.py index 3baf1565..ff54c385 100644 --- a/tradein-mvp/backend/app/services/scrapers/yandex_newbuilding.py +++ b/tradein-mvp/backend/app/services/scrapers/yandex_newbuilding.py @@ -93,7 +93,10 @@ RE_AREA_HA = re.compile(r"участке\s+([\d,]+)\s*га", re.IGNORECASE) RE_COMMISSION = re.compile( r"(?:введ[её]н|сдан)\s+в\s+эксплуатацию\s+в\s+(\w+)\s+(\d{4})", re.IGNORECASE ) -RE_RATING = re.compile(r"(\d[.,]\d)\s+из\s+5") +# Yandex drift (#974 follow-up): рейтинг рендерится без пробела перед «из» +# ("4.3из 5" / "4,5из 5", nbsp внутри) → \s* (а не \s+) перед «из», иначе rating=NULL +# при заполненных ratings_count/text_reviews (verified live 2026-06-15, ЖК Татлин/Рио). +RE_RATING = re.compile(r"(\d[.,]\d)\s*из\s+5") RE_RATINGS_COUNT = re.compile(r"(\d+)\s+оценок", re.IGNORECASE) RE_TEXT_REVIEWS = re.compile(r"Смотреть\s+все\s+(\d+)\s+отзыв", re.IGNORECASE) RE_CORPUS_COUNT_WORD = re.compile( diff --git a/tradein-mvp/backend/tests/test_yandex_newbuilding.py b/tradein-mvp/backend/tests/test_yandex_newbuilding.py index fa17eed0..789f938d 100644 --- a/tradein-mvp/backend/tests/test_yandex_newbuilding.py +++ b/tradein-mvp/backend/tests/test_yandex_newbuilding.py @@ -246,6 +246,32 @@ def test_parse_rating_comma_separator(): assert info.ratings_count == 200 +def test_parse_rating_no_space_before_iz(): + """Yandex drift (#974): '4.3из 5' / '4,5из\xa05' — без пробела перед «из», nbsp внутри. + + Регрессия 2026-06-15: live-страницы рендерили рейтинг как «4.3из 5» (без + разделителя), из-за чего \\s+ перед «из» не матчил → rating=NULL при + заполненных ratings_count. \\s* должен извлечь рейтинг в обеих формах. + """ + scraper = YandexNewbuildingScraper() + info = scraper.parse( + "