Заголовки H1–H6: семантическая иерархия документа и типичные ошибки
1. Архитектура и принцип работы
Парсер читает DOM и собирает последовательность заголовков в порядке появления. Дальше строится дерево: H1 — корень, H2 — его дети, H3 — дети H2 и так далее. Если уровень прыгает (H2 → H4), дерево ломается, и робот либо чинит его эвристикой, либо теряет часть контекста. Заголовки попадают в текстовый индекс вместе с содержимым ближайшего блока: параграфы, списки, таблицы под H2 считаются раскрытием этой подтемы. Отсюда два эффекта. Первый — тематический: ключи в заголовках весят больше, чем в теле, но меньше, чем в title. Второй — навигационный: по H2–H3 поисковик собирает «якоря» для расширенных сниппетов и карусели «по разделам». Для скринридеров и краулеров заголовки — это оглавление. Если на странице один H1 и аккуратная сетка H2/H3, робот быстрее определяет главную сущность и её атрибуты.
2. Математическая механика и триггеры ранжирования
Робот нормализует заголовки: срезает пробелы, приводит регистр, отбрасывает пустые теги. Строится массив вида [(level, text, position)]. Проверка иерархии — сравнение level[i] с level[i-1]: допустимый шаг +1, шаг 0 (сиблинг) и любой минус (возврат вверх). Шаг больше +1 даёт флаг broken_hierarchy. Вес заголовка в BM25-подобной модели считается как tf * (k1+1) / (tf + k1*(1-b+b*dl/avgdl)), где для H1–H3 применяется буст-коэффициент поля (обычно 1.5–2.0 к весу body). Дополнительно учитывается доля заголовков с ключом: heading_key_coverage = headings_with_keyword / total_headings, комфортный диапазон 0.4–0.7. Длина H1 в символах влияет на усечение в сниппете: практический лимит 60–70 знаков, H2 — до 90. Проверяется и уникальность: duplicate_h1_ratio = 1 - unique_h1 / total_pages. Значение выше 0.3 по разделу — сигнал шаблонных заголовков.
3. Специфика в Яндекс (YATI) vs Google
Оба поисковика строят иерархию заголовков, но акценты разные. Google активнее использует H2–H3 для формирования «Jump to» в сниппете и для passage ranking: отдельный абзац под H3 может ранжироваться по узкому запросу независимо от всей страницы. Яндекс сильнее опирается на заголовки при определении коммерческих и информационных интентов, а также в алгоритмах типа «Островов» — заголовки помогают разметить блоки ответов. Google терпимее к нескольким H1 (HTML5 разрешает H1 в section), но на практике один H1 на страницу остаётся безопасным паттерном. Яндекс в вебмастере явно подсвечивает отсутствие H1 и дубли. Для обоих критично, чтобы заголовок совпадал с содержимым блока: кликбейтный H2 с нерелевантным текстом снижает поведенческие и доверие к документу.
4. Нормативы SLA и диагностическая матрица
| Параметр / Метрика | Эталон по SLA | Критическая ошибка |
|---|---|---|
| Количество H1 на страницу | 1 | 0 или ≥2 |
| Доля заголовков с целевым ключом (heading_key_coverage) | 0.4–0.7 | <0.2 или >0.9 |
| Прыжки уровней (broken_hierarchy) | 0 | >5% страниц раздела |
5. Пошаговый инженерный протокол внедрения
- Соберите карту заголовков через Screaming Frog или парсер DOM: выгрузите level, text, position для всех URL раздела и постройте дерево.
- Введите правило один H1 на страницу с ключом в первых 60 знаках, H2 — подтемы с LSI-запросами, H3 — уточнения внутри H2.
- Проверьте шаблоны: title, H1 и breadcrumb не должны дублироваться дословно, иначе duplicate_h1_ratio растёт.
- Настройте регулярный краулинг с алертом на broken_hierarchy и пустые заголовки — это дешевле, чем ловить просадку трафика постфактум.
Правило проверки иерархии: для последовательности уровней L допустимо L[i] - L[i-1] <= 1; иначе флаг broken_hierarchy. Пример разметки: <h1>Комплексный SEO-аудит сайта</h1><h2>Этапы аудита</h2><h3>Технический краулинг</h3><h3>Анализ заголовков H1–H6</h3><h2>Отчёт и приоритеты</h2>.
6. Типичные ошибки при оптимизации
- Несколько H1 на странице из-за шаблона: логотип, название товара и блок «похожие» все обёрнуты в H1 — робот не понимает главную сущность.
- Прыжки уровней H2 → H4 ради визуального размера шрифта: иерархия ломается, часть подтем выпадает из дерева.
- Заголовки-картинки или заголовки в JS-виджетах без текстового слоя: в DOM их нет, для робота блок безымянный.
