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()