feat(scrapers/n1): извлекать floor/total_floors из ведущего N/M-токена (Refs #795) #802
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
2 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: lekss361/gendesign#802
Loading…
Add table
Reference in a new issue
No description provided.
Delete branch "fix/795-n1-floor-parser"
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?
Что
n1.pyне извлекалfloor/total_floors(оба 0% уsource='n1'). Этаж присутствует в тексте карточки ведущим токеномN/M(напр."1/11 2-к, Репина, 75/2 стр."→ этаж 1 из 11), до сегмента комнат.Как
_extract_floor_from_title(text)+^-anchored regex^\s*(\d{1,3})\s*/\s*(\d{1,3})\b— мид-стрингные дроби (дом75/2) не матчатся. Валидацияfloor>=1,total>=floor,total<=100→ иначе(None,None)._card_to_lotвыставляетfloor/total_floorsизlink.text()(тот же источник, что rooms/address).listing_dateне трогался (на N1 SERP даты нет — подтверждено пробой).Тесты
test_n1_floor_parse.py— 19 кейсов (happy1/11→(1,11), none, guard «дом 75/2 не floor», integration).pytest -k n1→ 24 passed, ruff clean.Refs #795
n1.py не извлекал floor/total_floors. Этаж в ведущем токене N/M карточки ('1/11 ...'→этаж 1 из 11). _extract_floor_from_title + ^-anchored regex (дом '75/2' не матчится), валидация диапазонов. listing_date не трогался. 19 тестов, 24 pass, ruff clean.✅ APPROVE
N1 floor/total_floors extraction (#795).
Correctness
_extract_floor_from_title:^\s*(\d{1,3})\s*/\s*(\d{1,3})\b—^-anchored → матчит только ведущий «N/M»; mid-string house-дробь («75/2») не захватывается. Sanity-guards (floor>=1,total>=floor,total<=100) → иначе(None,None). Элегантно ловит edge, где address-leading дробь («75/2») могла бы матчнуть:total(2)<floor(75)→ отклонено. Double-safe (anchor + sanity)._card_to_lotвыставляет floor/total_floors изlink.text()(тот же источник что rooms/address); area/price/rooms/address не тронуты;listing_dateкорректно None (на N1 SERP даты нет).Tests — 19 кейсов: happy (1/11, 17/17, 2/100 edge, leading-ws), none (no-token, house-fraction, mid-string, floor=0, inverted 9/5, >100, empty), integration (_card_to_lot floor/none/listing_date). 24 passed, ruff clean. Сильное покрытие false-positive.
Scope/security — n1.py + тест (+ ruff-format reflow); нет secrets, нет self-extending триггера. P3, low-volume source.
Verdict: ✅ APPROVE (#795). Floor-coverage post-rescrape → qa.