Загрузка данных
Продолжай работу с текущего состояния проекта.
Работай только в:
/Users/23865613/IdeaProjects/untitled/zadanie2/source_project
Не анализируй весь проект заново. Сначала прочитай только:
- PROJECT_STATE.md
- scripts/meta_page_expander.py
- scripts/scrape_meta.py
- scripts/html_to_markdown.py
- projects/SNL/meta/as/SberGeo/attributes/README.md
- projects/SNL/meta/as/SberGeo/fp/SberGeo.СНЛ/attributes/README.md
Текущий подтверждённый результат:
- реальные атрибуты уже извлекаются;
- для АС получено 11 пар;
- для ФП получено 12 пар;
- пары записываются в Markdown-таблицы;
- py_compile проходит;
- повторная регенерация идемпотентна.
Оставшаяся ошибка:
все пары записываются в раздел «Без раздела», потому что текущий алгоритм
не связывает строки с заголовками:
- Карточка;
- Ответственность;
- Дополнительные атрибуты;
- Технические атрибуты.
Нужно исправить только классификацию уже найденных атрибутов по разделам.
Не менять:
- иерархию projects/SNL/meta;
- размещение АС, ФП, модулей, подмодулей и ТК;
- integration-flow;
- integration;
- integration-point;
- определение родительских связей;
- дедупликацию архитектурных объектов.
Не выполнять commit и push.
======================================================================
1. ПРОВЕРИТЬ ФАКТИЧЕСКИЙ DOM ВКЛАДКИ «АТРИБУТЫ»
======================================================================
На странице АС и странице ФП открыть вкладку «Атрибуты».
Для каждого из четырёх заголовков определить:
- HTML-тег;
- role;
- class;
- data-testid, если существует;
- ближайший общий родитель;
- какие строки или таблицы находятся после этого заголовка;
- встречается ли следующий заголовок внутри того же контейнера.
Искать заголовки по нормализованному тексту:
- Карточка;
- Карточка объекта;
- Ответственность;
- Дополнительные атрибуты;
- Технические атрибуты.
Поиск должен быть нечувствительным к:
- регистру;
- неразрывным пробелам;
- лишним пробелам;
- двоеточию в конце;
- количеству пробелов между словами.
Сначала вывести диагностическую таблицу:
| Страница | Заголовок | Найден | Тег | Role | Строк внутри |
|---|---|---|---|---|---:|
======================================================================
2. НЕ ИСПОЛЬЗОВАТЬ ОБЩИЙ TEXTCONTENT ДЛЯ КЛАССИФИКАЦИИ
======================================================================
Текущий сбор общего текста страницы через textContent.split('\n') можно
оставить только как резервный механизм.
Основной алгоритм должен работать по DOM-структуре.
Запрещено:
- собрать весь текст вкладки;
- удалить заголовки;
- после этого пытаться угадать раздел;
- распределять строки по разделам по порядковому номеру;
- вручную указывать, какие конкретные поля относятся к какому разделу.
Раздел должен определяться структурой DOM.
======================================================================
3. АЛГОРИТМ ОПРЕДЕЛЕНИЯ ГРАНИЦ РАЗДЕЛА
======================================================================
Для каждого найденного заголовка использовать следующий порядок.
Вариант 1 — контейнер раздела:
1. Найти ближайшего предка заголовка.
2. Проверить, содержит ли он:
- текущий заголовок;
- строки таблицы или пары поле/значение;
- и не содержит ли заголовок следующего раздела.
3. Если условия выполнены, считать этот элемент контейнером раздела.
Вариант 2 — диапазон между заголовками:
Если отдельного контейнера нет:
1. Получить все элементы вкладки в DOM-порядке.
2. Найти позицию текущего заголовка.
3. Найти позицию следующего заголовка.
4. Собрать строки только между ними.
5. Для последнего раздела собирать до конца содержимого вкладки.
Вариант 3 — accordion:
Если раздел является раскрывающейся панелью:
1. Проверить aria-expanded.
2. Если панель закрыта, выполнить безопасный клик.
3. Дождаться появления содержимого.
4. Собрать строки только из панели этого заголовка.
Не нажимать кнопки:
- сохранить;
- изменить;
- создать;
- отправить;
- удалить;
- подтвердить.
======================================================================
4. ИЗВЛЕЧЕНИЕ СТРОК ВНУТРИ КАЖДОГО РАЗДЕЛА
======================================================================
В пределах конкретного раздела сначала искать:
- tr;
- [role="row"];
- td;
- th;
- [role="cell"];
- [role="gridcell"];
- элементы definition list: dt и dd;
- элементы label/value, если структура страницы использует отдельные блоки.
Для строки:
- первая ячейка или label — поле;
- остальные ячейки или связанный value — значение;
- несколько частей значения объединить через пробел;
- пустые строки пропустить;
- одинаковые пары внутри одного раздела дедуплицировать.
Если табличных элементов нет, допускается последовательное объединение
текстовых элементов, но только внутри уже определённого контейнера раздела.
Нельзя переносить пары между разделами.
======================================================================
5. ФОРМАТ РЕЗУЛЬТАТА
======================================================================
Результат должен формироваться как:
{
"Карточка": [
["Наименование краткое", "Геоинформационная система SberGeo"],
...
],
"Ответственность": [
...
],
"Дополнительные атрибуты": [
...
],
"Технические атрибуты": [
...
]
}
Раздел «Без раздела» допускается только для реально неклассифицированных
элементов после попытки классификации по DOM.
Если «Без раздела» остался, в отчёте перечислить каждую такую пару и объяснить,
почему её DOM-контейнер не удалось определить.
======================================================================
6. ОБНОВИТЬ MARKDOWN
======================================================================
Обновить:
projects/SNL/meta/as/SberGeo/attributes/README.md
projects/SNL/meta/as/SberGeo/fp/SberGeo.СНЛ/attributes/README.md
Ожидаемый формат:
# Атрибуты
## Карточка
| Поле | Значение |
|---|---|
| ... | ... |
## Ответственность
| Поле | Значение |
|---|---|
| ... | ... |
## Дополнительные атрибуты
| Поле | Значение |
|---|---|
| ... | ... |
## Технические атрибуты
| Поле | Значение |
|---|---|
| ... | ... |
Раздел создавать только при наличии реальных строк.
Не добавлять фиктивные строки «Не найдено» внутрь таблицы.
Если раздел действительно отсутствует, после заголовка допустима фраза:
«Данные раздела не обнаружены в сохранённом DOM.»
======================================================================
7. СОХРАНИТЬ ТЕКУЩИЕ РЕАЛЬНЫЕ ПАРЫ
======================================================================
Нельзя потерять уже найденные данные:
- 11 пар АС;
- 12 пар ФП.
После исправления сумма строк по всем разделам должна быть не меньше текущего
количества, если только не были удалены доказанные полные дубли.
Показать сверку:
| Страница | Было пар | Стало пар | Потеряно | Добавлено |
|---|---:|---:|---:|---:|
| АС | 11 | ... | ... | ... |
| ФП | 12 | ... | ... | ... |
Для каждой потерянной пары указать причину.
======================================================================
8. БРАУЗЕРНЫЙ ПРОГОН
======================================================================
Поскольку заголовки и контейнеры вкладки доступны только в динамическом DOM,
выполнить браузерный прогон через открытую авторизованную сессию SberBrowser.
META использовать только в read-only режиме.
Не использовать:
- API META;
- requests;
- httpx;
- aiohttp;
- urllib;
- cookies;
- токены;
- localStorage;
- sessionStorage.
Не выполнять вход автоматически.
Обрабатывать только страницы АС и ФП, необходимые для вкладки «Атрибуты»,
если полный прогон всех 41 URL не требуется для проверки исправления.
После успешной проверки выполнить обычный полный прогон только при
необходимости обновления общего результата.
======================================================================
9. ПРОВЕРКИ
======================================================================
Выполнить:
python -m py_compile run_exporter.py scripts/*.py
После обновления данных:
python scripts/regenerate_reports.py
python scripts/regenerate_reports.py
Проверить:
- количество строк таблиц не растёт;
- строки не дублируются;
- пары не перемещаются между разделами при повторном запуске;
- оба запуска дают одинаковый результат;
- архитектурная структура не меняется;
- количество АС, ФП, модулей, подмодулей и ТК не меняется;
- интеграционные объекты не меняются.
======================================================================
10. ОБНОВИТЬ ДОКУМЕНТАЦИЮ
======================================================================
Обновить:
- PROJECT_STATE.md
- output/ATTRIBUTES_REPORT.md
- output/REQUIREMENTS_REPORT.md
- output/TASK_COVERAGE.md
Требование по атрибутам считать полностью закрытым только если реальные пары
распределены по фактическим разделам вкладки.
Если META не содержит визуально отдельных разделов или DOM не позволяет
однозначно определить принадлежность, поставить статус «Частично» и привести
фактическое доказательство.
======================================================================
11. ФИНАЛЬНЫЙ ОТЧЁТ
======================================================================
В финале показать:
1. какие файлы изменены;
2. как определяются границы разделов;
3. результаты поиска четырёх заголовков для АС;
4. результаты поиска четырёх заголовков для ФП;
5. количество пар в каждом разделе;
6. количество пар «Без раздела»;
7. сверку 11 старых пар АС и 12 старых пар ФП;
8. примеры двух реальных пар из каждого найденного раздела;
9. результат py_compile;
10. результат двух регенераций;
11. потребовался ли полный браузерный прогон;
12. какие требования ещё остаются незакрытыми.
После завершения остановиться.