From f34edeb5129c38db2164270459ae614d3c7fe675 Mon Sep 17 00:00:00 2001 From: bot-backend Date: Fri, 21 Aug 2026 23:40:22 +0300 Subject: [PATCH] =?UTF-8?q?chore(tradein/avito):=20=D1=81=D1=81=D1=8B?= =?UTF-8?q?=D0=BB=D0=BA=D0=B8=20=D0=BD=D0=B0=20=D1=80=D0=B5=D0=B0=D0=BB?= =?UTF-8?q?=D1=8C=D0=BD=D1=8B=D0=B9=20issue=20#3047=20=D0=B2=D0=BC=D0=B5?= =?UTF-8?q?=D1=81=D1=82=D0=BE=20=D0=B2=D1=8B=D0=B4=D1=83=D0=BC=D0=B0=D0=BD?= =?UTF-8?q?=D0=BD=D0=BE=D0=B3=D0=BE=20=D0=BD=D0=BE=D0=BC=D0=B5=D1=80=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Воркер сослался на #3086, которого не существует — тест с таким именем остался бы загадкой для следующего читателя. Заведён настоящий issue #3047 с замерами покрытия и разбором дефекта; все ссылки и имя файла приведены к нему. Refs #3047 --- ...elds_3086.py => test_avito_detail_fields_3047.py} | 2 +- .../src/scraper_kit/providers/avito/detail.py | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) rename tradein-mvp/backend/tests/{test_avito_detail_fields_3086.py => test_avito_detail_fields_3047.py} (98%) diff --git a/tradein-mvp/backend/tests/test_avito_detail_fields_3086.py b/tradein-mvp/backend/tests/test_avito_detail_fields_3047.py similarity index 98% rename from tradein-mvp/backend/tests/test_avito_detail_fields_3086.py rename to tradein-mvp/backend/tests/test_avito_detail_fields_3047.py index 5a0c652b..17e62a09 100644 --- a/tradein-mvp/backend/tests/test_avito_detail_fields_3086.py +++ b/tradein-mvp/backend/tests/test_avito_detail_fields_3047.py @@ -1,4 +1,4 @@ -"""Тесты на реальной разметке для #3086 (5 полей detail-парсера Avito). +"""Тесты на реальной разметке для #3047 (5 полей detail-парсера Avito). Фикстуры — две живые detail-карточки, снятые через прод-браузер 2026-08-21: - avito_detail_card_owner_66m2.html — item_id 8322506679, продавец "Частное лицо" diff --git a/tradein-mvp/packages/scraper-kit/src/scraper_kit/providers/avito/detail.py b/tradein-mvp/packages/scraper-kit/src/scraper_kit/providers/avito/detail.py index 3ca3fad9..90705a4e 100644 --- a/tradein-mvp/packages/scraper-kit/src/scraper_kit/providers/avito/detail.py +++ b/tradein-mvp/packages/scraper-kit/src/scraper_kit/providers/avito/detail.py @@ -18,7 +18,7 @@ enrichment = await fetch_detail(item_url) saved = save_detail_enrichment(db, enrichment) -#3086 — сверка с эталонной разметкой (2 живые карточки, 2026-08-21), что реально +#3047 — сверка с эталонной разметкой (2 живые карточки, 2026-08-21), что реально парсится и что нет: - sale_type: не переименование, было сломано ЧТЕНИЕ таблицы параметров — Avito отдаёт "О квартире" и "О доме" как ДВА ОТДЕЛЬНЫХ
с ОДНИМ И ТЕМ ЖЕ @@ -114,7 +114,7 @@ _PUBLISH_DATE_RE = re.compile( r"июля|августа|сентября|октября|ноября|декабря)\s+в", re.IGNORECASE, ) -# Относительные варианты даты публикации (#3086: на эталонах 2026-08-21 marker +# Относительные варианты даты публикации (#3047: на эталонах 2026-08-21 marker # item-view/item-date отдаёт "· сегодня в HH:MM" — раньше эта дата не читалась вовсе, # см. _extract_meta). "вчера" не встретилась в эталонах, но это тот же УИ-паттерн — # добавлена по аналогии, не подтверждена живьём. @@ -644,7 +644,7 @@ def parse_detail_html(html: str, source_url: str) -> DetailEnrichment: description = _text(tree, "[data-marker='item-view/item-description']") # ── Metro ──────────────────────────────────────────────────────────────── - # #3086: раньше метро бралось ТОЛЬКО из текста описания (_extract_metro) — 28 + # #3047: раньше метро бралось ТОЛЬКО из текста описания (_extract_metro) — 28 # строк из 54 855 avito-листингов. На эталонах 2026-08-21 метро есть в структурной # разметке (div#item-view-address, по одному на станцию с иконкой # "Пешком до метро") — читаем оттуда в первую очередь, оно покрывает и станции @@ -659,7 +659,7 @@ def parse_detail_html(html: str, source_url: str) -> DetailEnrichment: metro_stations = _extract_metro(description) # ── Cadastral number ──────────────────────────────────────────────────── - # #3086: НЕ извлекается — на эталонах 2026-08-21 нет ни текста "кадастров"/ + # #3047: НЕ извлекается — на эталонах 2026-08-21 нет ни текста "кадастров"/ # "Кадастровый" на странице, ни заполненного значения. Единственный след поля — # пустая строка в JSON-блоке domotekaReportTeaser.cadastralNumber ("":"" — схема # у Avito зарезервирована, но не заполняется на наблюдаемых карточках). Не @@ -688,7 +688,7 @@ def parse_detail_html(html: str, source_url: str) -> DetailEnrichment: photo_urls.append(src) # ── Params blocks ──────────────────────────────────────────────────────── - # #3086: на эталонах 2026-08-21 "О квартире" и "О доме" — ДВА ОТДЕЛЬНЫХ
+ # #3047: на эталонах 2026-08-21 "О квартире" и "О доме" — ДВА ОТДЕЛЬНЫХ
# с ОДНИМ И ТЕМ ЖЕ data-marker='item-view/item-params' (каждый со своим
    ), # а не один div с двумя
      внутри, как предполагал старый код (комментарий # "некоторые страницы совмещают всё в одном ul" ниже описывал ИМЕННО эту старую @@ -1184,7 +1184,7 @@ def _extract_is_homeowner(tree: HTMLParser) -> bool | None: def _extract_meta(tree: HTMLParser) -> tuple[date | None, int | None, int | None]: """Извлечь publish_date, views_total, views_today. - publish_date (#3086): раньше искалась ТОЛЬКО внутри текста item-id-блока + publish_date (#3047): раньше искалась ТОЛЬКО внутри текста item-id-блока ([data-marker='item-view/item-id']) — на эталонах 2026-08-21 этот блок содержит ИСКЛЮЧИТЕЛЬНО "№ ", а дата лежит в СОСЕДНЕМ элементе [data-marker='item-view/item-date'] (" · сегодня в HH:MM"), который .text()