Загрузка данных
Продолжай с текущего состояния. Не анализируй проект заново.
Работай только в:
/Users/23865613/IdeaProjects/untitled/zadanie2/source_project
Сначала прочитай только:
- PROJECT_STATE.md
- scripts/attribute_scraper.py
- scripts/scrape_meta.py
- scripts/meta_page_expander.py
- scripts/structured_meta_writer.py
Текущий подтверждённый статус:
- scripts/attribute_scraper.py уже создан;
- для АС и ФП найдены все четыре заголовка:
- Карточка;
- Ответственность;
- Дополнительные атрибуты;
- Технические атрибуты;
- реальные данные уже собираются:
- АС — 11 пар;
- ФП — 12 пар;
- но новый классификатор не подключён к фактическому сбору;
- все пары пока записываются в «Без раздела»;
- данные из _scroll_and_collect_rows() не передаются в attribute_scraper.
Нужно не проводить новый аудит, а завершить реализацию.
======================================================================
1. ПОДКЛЮЧИТЬ attribute_scraper К РЕАЛЬНОМУ ПРОГОНУ
======================================================================
Найди фактическое место в scripts/scrape_meta.py или
scripts/meta_page_expander.py, где после открытия вкладки «Атрибуты»
собираются строки функцией:
_scroll_and_collect_rows(...)
или эквивалентной функцией.
После открытия вкладки и раскрытия всех секций необходимо вызвать новый
DOM-классификатор из scripts/attribute_scraper.py.
Нельзя оставить новый модуль неиспользуемым.
В результате основной код должен получать структуру:
{
"Карточка": [...],
"Ответственность": [...],
"Дополнительные атрибуты": [...],
"Технические атрибуты": [...],
"Без раздела": [...]
}
Не создавать отдельный тестовый результат, который не используется
генератором Markdown.
======================================================================
2. ЕДИНСТВЕННЫЙ ИСТОЧНИК ДАННЫХ
======================================================================
После подключения классификатора именно его результат должен передаваться:
- в результат scrape_meta;
- в промежуточные данные страницы;
- в structured_meta_writer;
- в attributes/README.md.
Старый плоский список атрибутов допускается оставить только как резервный
fallback, если DOM-классификатор завершился с ошибкой.
Запрещено одновременно записывать:
- результат нового классификатора;
- и старый плоский список;
поскольку это создаст дубли.
======================================================================
3. ПРАВИЛЬНО ПЕРЕДАТЬ ДАННЫЕ ИЗ БРАУЗЕРА
======================================================================
Проверить, что новый классификатор выполняется в контексте Playwright Page
или Locator вкладки «Атрибуты», а не пытается работать с уже потерявшим
структуру текстовым списком.
Правильная последовательность:
1. открыть нужную страницу;
2. открыть вкладку «Атрибуты»;
3. раскрыть доступные секции;
4. дождаться стабилизации DOM;
5. получить активный container с role="tabpanel";
6. вызвать DOM-классификатор;
7. вернуть классифицированные пары;
8. сохранить HTML страницы;
9. сформировать Markdown.
Не классифицировать строки после удаления заголовков.
======================================================================
4. ИСПРАВИТЬ ФОРМАТ attributes/README.md
======================================================================
Обновить генерацию файлов:
projects/SNL/meta/as/SberGeo/attributes/README.md
projects/SNL/meta/as/SberGeo/fp/SberGeo.СНЛ/attributes/README.md
Формат:
# Атрибуты
## Карточка
| Поле | Значение |
|---|---|
| ... | ... |
## Ответственность
| Поле | Значение |
|---|---|
| ... | ... |
## Дополнительные атрибуты
| Поле | Значение |
|---|---|
| ... | ... |
## Технические атрибуты
| Поле | Значение |
|---|---|
| ... | ... |
Раздел выводится только при наличии строк.
Раздел «Без раздела» выводить только в самом конце и только если после
DOM-классификации действительно остались неклассифицированные пары.
======================================================================
5. ВЫПОЛНИТЬ БРАУЗЕРНЫЙ ПРОГОН
======================================================================
Выполнить целевой браузерный прогон только для страниц:
- АС SberGeo;
- ФП SberGeo.СНЛ.
Использовать открытую авторизованную сессию SberBrowser.
META — строго read-only.
Запрещено:
- API META;
- requests/httpx/aiohttp/urllib;
- автоматический вход;
- чтение cookies, localStorage, sessionStorage;
- действия сохранения, изменения, создания или удаления.
Не выполнять полный прогон 41 URL, если для исправления атрибутов достаточно
двух страниц.
======================================================================
6. ПРОВЕРИТЬ ФАКТИЧЕСКИЙ РЕЗУЛЬТАТ
======================================================================
После браузерного прогона прочитать оба сформированных attributes/README.md.
Показать таблицу:
| Страница | Карточка | Ответственность | Дополнительные | Технические | Без раздела | Всего |
|---|---:|---:|---:|---:|---:|---:|
| АС | ... | ... | ... | ... | ... | ... |
| ФП | ... | ... | ... | ... | ... | ... |
Критерии:
- АС: итоговое количество не меньше 11 пар без учёта удалённых полных дублей;
- ФП: итоговое количество не меньше 12 пар без учёта удалённых полных дублей;
- хотя бы один реальный раздел должен содержать строки;
- все 11 и 12 пар не могут остаться в «Без раздела», если четыре заголовка
действительно найдены;
- таблицы должны содержать реальные поля и значения, а не только заголовки.
Показать по две реальные пары из каждого непустого раздела.
======================================================================
7. ПРОВЕРИТЬ FALLBACK
======================================================================
Если DOM-классификатор возвращает ноль строк при найденных четырёх заголовках,
это считать ошибкой реализации, а не отсутствием данных.
В этом случае:
- вывести DOM-диагностику;
- исправить связь между заголовком и строками;
- повторить целевой прогон.
Не завершать работу со статусом «нужен ещё один запуск».
======================================================================
8. ТЕХНИЧЕСКИЕ ПРОВЕРКИ
======================================================================
Выполнить:
python -m py_compile run_exporter.py scripts/*.py
После успешного браузерного прогона:
python scripts/regenerate_reports.py
python scripts/regenerate_reports.py
Проверить:
- оба запуска формируют одинаковые файлы;
- таблицы не дублируются;
- количество пар не растёт;
- «Без раздела» не заполняется повторными копиями;
- архитектурная иерархия не меняется;
- интеграции не меняются;
- ТК не перемещаются;
- старые каталоги не восстанавливаются.
======================================================================
9. ОБНОВИТЬ PROJECT_STATE И ОТЧЁТЫ
======================================================================
Обновить:
- PROJECT_STATE.md
- output/ATTRIBUTES_REPORT.md
- output/REQUIREMENTS_REPORT.md
- output/TASK_COVERAGE.md
Не писать, что требование закрыто, пока оба attributes/README.md не содержат
реальные пары, распределённые по разделам.
======================================================================
10. ФИНАЛЬНЫЙ ОТЧЁТ
======================================================================
В финале показать:
1. где attribute_scraper подключён к основному потоку;
2. какие функции изменены;
3. результат браузерного прогона АС;
4. результат браузерного прогона ФП;
5. количество строк каждого раздела;
6. количество строк «Без раздела»;
7. сверку прежних 11 и 12 пар;
8. содержимое заголовков обоих attributes/README.md;
9. результат py_compile;
10. результат двух регенераций;
11. подтверждение идемпотентности;
12. остались ли незакрытые требования.
Не завершать ответ фразой «требуется ещё один запуск».
Работа считается завершённой только после фактического целевого браузерного
прогона и проверки созданных Markdown-файлов.
Не выполнять git commit и git push.