[low] Avito relative-date parser возвращает None для бесцифровых форм ('час назад', 'неделю назад', 'день назад') #1387

Closed
opened 2026-06-14 18:10:13 +00:00 by bot-backend · 0 comments
Collaborator

Описание

Карточки Avito SERP регулярно показывают давность в единственном числе БЕЗ ведущего числа: 'час назад', 'минуту назад', 'день назад', 'неделю назад', 'месяц назад'. Keyword fast-path (строки 110-115) обрабатывает только 'позавчера'/'вчера'/'сегодня'/'только что'. Остальное идёт через _REL_DATE_RE, который требует числовой квантификатор (?P<n>\d+). Строка без цифры не матчит, absolute-date ветка тоже фейлит → функция возвращает None. Эти карточки получают listing_date=None, хотя дата однозначна. Противоречит докстрингу (строка 97), который перечисляет эти формы как поддерживаемые.

Корень

Регекс требует обязательную цифру; нет ветки для единичных бесцифровых форм. Митигировано тем, что sortTimeStamp из встроенного per-item JSON (строки 690-696) — основной источник, покрывает почти все карточки; _parse_relative_date достигается только в fallback.

Evidence

avito.py:95-155:

_REL_DATE_RE = re.compile(r"(?P<n>\d+)\s+(?P<unit>...) ... \s+назад")
...
m = _REL_DATE_RE.search(s)
if m:
    n = int(m["n"])
# keyword-ветки: только позавчера/вчера/сегодня/только что — нет 'час назад'/'неделю назад'

Suggested fix

Добавить обработку единичных keyword до числового регекса: 'час назад'/'минут'/'только что'→today; 'день назад'→today-1d; 'неделю назад'→today-7d; 'месяц назад'→today-30d. Либо сделать квантификатор опциональным ((?P<n>\d+)?\s*<unit>\s+назад) с дефолтом n=1.

Обоснование severity (low)

Blast radius ограничен fallback-only карточками без sortTimeStamp (сетевые ошибки, malformed JSON, edge-case). Большинство карточек с 'час назад' уже покрыты ts_map. Реальный баг (докстринг неверен), но не каждая карточка получает None. Confidence 0.93.


week ревью 1 · multi-agent аудит 2026-06-14 · severity=low · category=logic

Затронутые файлы:

  • /Users/anton/Птица/gendesign/tradein-mvp/backend/app/services/scrapers/avito.py
## Описание Карточки Avito SERP регулярно показывают давность в единственном числе БЕЗ ведущего числа: 'час назад', 'минуту назад', 'день назад', 'неделю назад', 'месяц назад'. Keyword fast-path (строки 110-115) обрабатывает только 'позавчера'/'вчера'/'сегодня'/'только что'. Остальное идёт через `_REL_DATE_RE`, который требует числовой квантификатор `(?P<n>\d+)`. Строка без цифры не матчит, absolute-date ветка тоже фейлит → функция возвращает None. Эти карточки получают `listing_date=None`, хотя дата однозначна. Противоречит докстрингу (строка 97), который перечисляет эти формы как поддерживаемые. ## Корень Регекс требует обязательную цифру; нет ветки для единичных бесцифровых форм. Митигировано тем, что `sortTimeStamp` из встроенного per-item JSON (строки 690-696) — основной источник, покрывает почти все карточки; `_parse_relative_date` достигается только в fallback. ## Evidence `avito.py:95-155`: ```python _REL_DATE_RE = re.compile(r"(?P<n>\d+)\s+(?P<unit>...) ... \s+назад") ... m = _REL_DATE_RE.search(s) if m: n = int(m["n"]) # keyword-ветки: только позавчера/вчера/сегодня/только что — нет 'час назад'/'неделю назад' ``` ## Suggested fix Добавить обработку единичных keyword до числового регекса: 'час назад'/'минут'/'только что'→today; 'день назад'→today-1d; 'неделю назад'→today-7d; 'месяц назад'→today-30d. Либо сделать квантификатор опциональным `((?P<n>\d+)?\s*<unit>\s+назад)` с дефолтом n=1. ## Обоснование severity (low) Blast radius ограничен fallback-only карточками без `sortTimeStamp` (сетевые ошибки, malformed JSON, edge-case). Большинство карточек с 'час назад' уже покрыты ts_map. Реальный баг (докстринг неверен), но не каждая карточка получает None. Confidence 0.93. --- _week ревью 1 · multi-agent аудит 2026-06-14 · severity=**low** · category=`logic`_ Затронутые файлы: - `/Users/anton/Птица/gendesign/tradein-mvp/backend/app/services/scrapers/avito.py`
bot-backend added the
week ревью 1
label 2026-06-14 18:10:13 +00:00
bot-backend added the
scope/backend
label 2026-06-15 11:01:56 +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#1387
No description provided.