[domrf_catalog] price_rub regex ловит цену за м² раньше полной цены → price_rub=NULL при наличии цены на странице #1645

Closed
opened 2026-06-16 18:46:50 +00:00 by bot-backend · 0 comments
Collaborator

Severity: high · Категория: parsing/regex/data-loss · Файл: backend/app/services/scrapers/domrf_catalog.py:242-255

Файл: backend/app/services/scrapers/domrf_catalog.py:242-255. Регекс ([\d][\d\s]{3,12}[\d])\s*(?:₽|руб) не исключает значение цены за квадрат. На странице каталога '217 835 ₽/м²' обычно выше полной стоимости. re.search берёт первое совпадение = '217 835', которое < нижней санити-границы 1_000_000 (стр. 252) и отбрасывается, а до настоящей цены '7 890 000 ₽' поиск уже не доходит. Импакт: price_rub остаётся NULL (COALESCE сохраняет старое/NULL), при этом scrape_one_flat рапортует success=True — тихая потеря цены, ровно та проблема, ради которой нужен ценовой скрапер. Фикс: negative lookahead после валюты — r'([\d][\d\s]{3,12}[\d])\s*(?:₽|руб)(?!\s*[/⁄])' (проверено: возвращает '7 890 000'), либо приоритетный матч цены, явно НЕ содержащей '/м²'.

Почему баг: price_rub остаётся NULL (через COALESCE старое значение/NULL сохраняется), хотя полная цена ЕСТЬ на странице. Это ровно та проблема, ради которой заведён #297 (91% квартир без цены). scrape_one_flat при этом рапортует success=True и fields_extracted без price — тихая потеря данных, ложь в отчёте о покрытии цен. Нужен negative lookahead на '/м²|кв.м' либо приоритетный матч цены, явно НЕ содержащей '/м²'.

Как чинить: Сначала вырезать/проигнорировать per-m² паттерн, либо добавить negative lookahead: r'([\d][\d\s]{3,12}[\d])\s*(?:₽|руб)(?![\s/⁄]*(?:м²|кв))', и/или искать ВСЕ матчи и брать тот, что проходит санити 1e6..5e8.


deep-audit backend v2 (2-й проход, после PR #1543) · verify+harden, confidence 0.9 · unit B33

**Severity:** high · **Категория:** parsing/regex/data-loss · **Файл:** `backend/app/services/scrapers/domrf_catalog.py:242-255` Файл: backend/app/services/scrapers/domrf_catalog.py:242-255. Регекс `([\d][\d\s]{3,12}[\d])\s*(?:₽|руб)` не исключает значение цены за квадрат. На странице каталога '217 835 ₽/м²' обычно выше полной стоимости. re.search берёт первое совпадение = '217 835', которое < нижней санити-границы 1_000_000 (стр. 252) и отбрасывается, а до настоящей цены '7 890 000 ₽' поиск уже не доходит. Импакт: price_rub остаётся NULL (COALESCE сохраняет старое/NULL), при этом scrape_one_flat рапортует success=True — тихая потеря цены, ровно та проблема, ради которой нужен ценовой скрапер. Фикс: negative lookahead после валюты — `r'([\d][\d\s]{3,12}[\d])\s*(?:₽|руб)(?!\s*[/⁄])'` (проверено: возвращает '7 890 000'), либо приоритетный матч цены, явно НЕ содержащей '/м²'. **Почему баг:** price_rub остаётся NULL (через COALESCE старое значение/NULL сохраняется), хотя полная цена ЕСТЬ на странице. Это ровно та проблема, ради которой заведён #297 (91% квартир без цены). scrape_one_flat при этом рапортует success=True и fields_extracted без price — тихая потеря данных, ложь в отчёте о покрытии цен. Нужен negative lookahead на '/м²|кв.м' либо приоритетный матч цены, явно НЕ содержащей '/м²'. **Как чинить:** Сначала вырезать/проигнорировать per-m² паттерн, либо добавить negative lookahead: `r'([\d][\d\s]{3,12}[\d])\s*(?:₽|руб)(?![\s/⁄]*(?:м²|кв))'`, и/или искать ВСЕ матчи и брать тот, что проходит санити 1e6..5e8. --- <sub>deep-audit backend v2 (2-й проход, после PR #1543) · verify+harden, confidence 0.9 · unit B33</sub>
bot-backend added the
week ревью 1
label 2026-06-16 18:46:50 +00:00
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: lekss361/gendesign#1645
No description provided.