fix(tradein/avito): парсер карточки читал только первый блок параметров — параметры дома терялись молча #3048

Merged
lekss361 merged 3 commits from fix/avito-detail-fields into main 2026-08-21 20:54:36 +00:00

3 commits

Author SHA1 Message Date
bot-backend
4c9f5b6e9f Merge remote-tracking branch 'forgejo/main' into fix/avito-detail-fields
All checks were successful
CI Trade-In / changes (pull_request) Successful in 9s
CI / changes (pull_request) Successful in 11s
CI Trade-In / browser-tests (pull_request) Has been skipped
CI Trade-In / frontend-checks (pull_request) Has been skipped
CI / backend-tests (pull_request) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Has been skipped
CI Trade-In / backend-tests (pull_request) Successful in 4m42s
2026-08-21 23:45:40 +03:00
f34edeb512 chore(tradein/avito): ссылки на реальный issue #3047 вместо выдуманного номера
All checks were successful
CI Trade-In / changes (pull_request) Successful in 8s
CI Trade-In / browser-tests (pull_request) Has been skipped
CI / changes (pull_request) Successful in 11s
CI Trade-In / frontend-checks (pull_request) Has been skipped
CI / backend-tests (pull_request) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Has been skipped
CI Trade-In / backend-tests (pull_request) Successful in 4m48s
Воркер сослался на #3086, которого не существует — тест с таким именем
остался бы загадкой для следующего читателя. Заведён настоящий issue #3047
с замерами покрытия и разбором дефекта; все ссылки и имя файла приведены
к нему.

Refs #3047
2026-08-21 23:40:22 +03:00
bot-backend
efce189c8b fix(tradein/avito): починить чтение параметров, добавить metro/is_homeowner/days_on_market
Разобрались по эталонной разметке (2 живые detail-карточки, 2026-08-21), что реально
парсится и что нет:

- sale_type: item-view/item-params — Avito отдаёт "О квартире" и "О доме" как ДВА
  ОТДЕЛЬНЫХ <div> с ОДНИМ И ТЕМ ЖЕ маркером, а не один div с двумя <ul>, как
  предполагал старый код. css_first брал только ПЕРВЫЙ div — sale_type это не
  задевало (он в первом блоке), но house_type/total_floors_house/лифты из второго
  блока терялись молча через мёртвую ветку `len(ul_els) >= 2`. Теперь читаем <ul>
  из ВСЕХ блоков с этим маркером — устойчиво к порядку блоков.
- metro_stations: раньше только эвристика по тексту описания (28 строк из 54 855).
  Основной источник теперь — структурная разметка (#item-view-address, иконка
  "Пешком до метро"), покрывает станции без ограничения на суффикс имени
  (METRO_RE ловил только "-ская"/"-инская"). Описание — фолбэк.
- is_homeowner: не парсился вовсе. [data-marker='seller-info/label'] — "Частное
  лицо" -> True, "Агентство" -> False. Подтверждено разными значениями на двух
  эталонах.
- days_on_market: на странице явно нет, но есть publish_date, из которого честно
  выводится. Заодно чинит сам publish_date — искали дату ВНУТРИ item-id-блока, а
  она в СОСЕДНЕМ [data-marker='item-view/item-date'] ("сегодня в HH:MM").
- cadastral_number: подтверждено отсутствие на странице (не парсим, не выдумываем).

Тесты на реальной разметке (backend/tests/test_avito_detail_fields_3086.py) на
обеих эталонных фикстурах (большие embedded JS-блобы вырезаны из фикстур —
не используются DOM-based парсером, экономят место). estimator.py не тронут —
ни одно поле не влияет на цену.
2026-08-21 23:36:19 +03:00