# Исправление чтения KHL.ru — build 2026.09.27.3 Обновление включает предыдущие исправления v1–v6, в том числе сравнение игроков, подсказки и дни рождения. ## Что обнаружено Прежняя проверка HTML принимала страницу с заголовком `403` за обычную страницу КХЛ. После этого поиск карточек возвращал пустой список, и интерфейс сообщал о возможном изменении разметки. Дефект воспроизведён на ранее сохранённом ответе сайта: документ размером 245 364 символа с заголовком и первым заголовком страницы `403` проходил старую проверку. Сообщение пользователя само по себе не доказывает, что его сервер получил именно эту страницу: без ответа с его сервера нельзя исключить другую разметку списка. Поэтому в обновление включена диагностика фактического ответа. ## Исправления - Заголовки ошибок 401/403/429/500/503 и страницы проверки доступа распознаются даже при внешнем HTTP 200. Они не сохраняются в HTML-кэш. - При ограничении доступа запросы останавливаются. Другие адреса не используются для обхода ограничения. Старые карточки остаются доступны. - Убраны автоматические повторы HTTP 429; обновление не ждёт длительный `Retry-After` внутри HTTP-повтора. - HTML декодируется из исходных байтов с учётом его кодировки. Русские имена не зависят от неверного значения ISO-8859-1, которое `requests` может выбрать для `text/html` без указанного charset. - Поиск карточек поддерживает относительные ссылки, `data-href`, `data-url` и реальные адреса карточек во встроенном JSON/JSON-LD. Ссылки на чужие домены и произвольные числовые ID не используются. - Если получена обычная HTML-страница, но список не распознан, полное обновление может прочитать ранее известные карточки по сохранённым адресам/подтверждённым KHL ID. Результат явно помечается как частичный: новые участники из списка не добавлены. Для операции «текущие судьи» и восстановления имён только по списку этот резерв не применяется. - Ошибка разбора одного справочника не прерывает независимое обновление остальных. Настоящее ограничение доступа останавливает все сетевые запросы текущего запуска. - Дата данных сохраняется отдельно для каждой карточки. Необновлённые карьерные цифры не получают новую дату только из-за записи общего JSON. - Итог обновления сообщает результат по игрокам, тренерам и судьям отдельно. ## Диагностика В «Настройки → КХЛ сайт» добавлена кнопка **«Диагностика КХЛ»**. После запуска обновления она скачивает `khl-diagnostics.json` с результатами справочников, последней проблемой, HTTP-статусом, заголовком HTML и определённой кодировкой. Cookies, заголовки авторизации и полный HTML в этот файл не записываются. Если на сервере получается настоящий 403, исправление парсера не снимает ограничение сайта. Проверьте https://www.khl.ru/players/ в браузере на компьютере, где работает сервер проекта. Если сайт и там сообщает об ограничении доступа, вопрос доступа необходимо решить с поддержкой КХЛ. Если браузер открывает список, а программа не обновляет данные, файл диагностики позволит проверить ответ, полученный программой. ## Установка 1. Остановите сервер проекта. 2. Распакуйте архив в существующую папку проекта с заменой файлов. 3. Запустите сервер и обновите страницу. 4. В «Настройки → КХЛ сайт» нажмите «Игроки» или «KHL.ru: обновить всё». 5. Если обновление не выполнено, скачайте файл кнопкой «Диагностика КХЛ». Пользовательские настройки, `.env`, базы данных, архив КХЛ и данные Agent в ZIP не включены. ## Проверка - 35 целевых проверок прошли: 17 новых сценариев чтения/ошибок/диагностики и 18 прежних проверок КХЛ/карьеры. - Полный Python-набор: 462 успешных, 40 прежних неудачных. Набор неудачных тестов совпадает с v6, новых нет. - Настоящий сохранённый ответ КХЛ с заголовком `403` теперь отвергается проверкой. - В интерфейсе через jsdom проверены список, карточки, обновление, сообщение при отсутствии диагностики и скачивание отчёта; ошибок JavaScript не зарегистрировано. - Проверены Python-компиляция, CLI `--help` с установленными зависимостями и синтаксис JavaScript интерфейса. Живая полная загрузка KHL.ru не подтверждена: сайт ответил 403 из среды проверки. Рабочая PostgreSQL пользователя и Windows/vMix в этой итерации не подключались. Проверки поведения выполнялись на локальных тестовых данных.