fix(scrapers): avito detail parser — захват Жилая площадь / Высота потолков / Отделка #1550
No reviewers
Labels
No labels
admin
analytics
auth
automation
bug
business
chore
ci
compliance
data
data-moat
docs
duplicate
dx
enhancement
Fable 5 ревью
feedback/max
generative
GG-форсайт
needs-discussion
needs-human
observability
pause-bots
performance
priority/p0
priority/p1
priority/p2
priority/p3
scope/backend
scope/db
scope/devops
scope/frontend
scope/qa
scrapers
security
site-finder
stage/1
stage/2
status/blocked
status/done
status/needs-analysis
status/needs-fix
status/qa
status/ready
status/review
status/wip
tech-debt
tradein
ux
week ревью 1
wontfix
вторичка
ИРД
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: lekss361/gendesign#1550
Loading…
Add table
Reference in a new issue
No description provided.
Delete branch "fix/avito-detail-apartment-fields"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Проблема (verified на проде + live)
Avito detail-парсер теряет поля квартир:
RUS_FIELD_MAP(avito_detail.py) не содержит «Жилая площадь», «Высота потолков», «Отделка». На продеliving_area_m2 = 0/15917заполнено (колонка существует с миграции 019, но в неё никогда не писали).Live-проверка 3 свежих EKB-объявлений (HTTP 200): подтверждены лейблы
«Жилая площадь»(формат"12.6\xa0м²", nbsp),«Высота потолков»("2.7\xa0м").«Отделка»/«Стоимость ремонта»на этих 3 не встретились — «Отделка» добавлена (встречается у новостроек),repair_costНЕ добавлен (лейбл не подтверждён).Фикс
avito_detail.py— зеркалит существующий паттернarea_m2/kitchen_area_m2в 4 местах (RUS_FIELD_MAP → DetailEnrichment dataclass → parse elif → save COALESCE + params):living_area_m2(_parse_float_m2, колонка уже есть).ceiling_height_m(новый хелпер_parse_height_m: "2.7 м"/"2,7 м"/"3 м"/nbsp → float; junk → None).finishing(cleaned text,.strip().lower()).data/sql/111_listings_avito_detail_fields.sql—ADD COLUMN IF NOT EXISTS ceiling_height_m numeric(5,2)+finishing text(idempotent;living_area_m2уже существует → не трогаем).tests/test_avito_detail_parse.py— happy-path с nbsp-значениями, absent-fields→None, 5 unit-тестов_parse_height_m, strip+lower для finishing.Проверки
uv run pytest(полный suite, CI deselect): 1795 passed, 2 deselected.ruff check+ruff format --check: clean.Зависимость
Миграция 111 (110 зарезервирована родственным PR #1549). Конфликтов файлов с #1549 нет.
STEP 0 (живая проверка 2026-06-16): три страницы EKB квартир вернули HTTP 200. Подтверждены метки: "Жилая площадь" (напр. "12.6 м²"), "Высота потолков" ("2.7 м"), "Отделка" (напр. "чистовая"). "Стоимость ремонта" — не обнаружена. - RUS_FIELD_MAP: добавлены три записи. - DetailEnrichment: новые поля living_area_m2/ceiling_height_m/finishing (в dataclass attrs и в locals-блоке parse_detail_html). - parse_detail_html: ветки elif для трёх полей; helper _parse_height_m(). - save_detail_enrichment: COALESCE-строки + params-dict для новых полей. - migration 111: ADD COLUMN IF NOT EXISTS ceiling_height_m, finishing (living_area_m2 уже существовала, migration не нужна). - Тесты: 5 новых кейсов в test_avito_detail_parse.py + 5 unit-тестов _parse_height_m. Полный suite: 1795 passed, 2 deselected.