Парсинг

6 августа 2026 · ~12 мин чтения

концепция данные компиляторы скрейпинг

Парсинг

Парсинг (parsing, синтаксический разбор) — процесс превращения плоской
последовательности символов или байтов в структуру, с которой может работать
программа: дерево, таблицу, набор объектов. Парсер — программа, которая это
делает, опираясь на правила формата (грамматику).

История

Само слово пришло из лингвистики: латинское pars orationis — «часть речи».
В английских школах XIX века «to parse» означало разобрать предложение по
членам — подлежащее, сказуемое, дополнение. Информатика забрала термин почти
без изменений: разница лишь в том, что вместо предложения — строка кода или
данных, а вместо школьника — программа.

Ключевые вехи:

Парсинг — не продукт, у него нет владельца. Это фундаментальная техника,
такая же базовая, как сортировка или поиск.

Что это такое

Компьютер хранит и передаёт всё как последовательность байтов. Файл на диске,
ответ сервера, лог, HTML-страница — это просто длинная лента символов. Но
программе, чтобы что-то сделать с данными, нужна структура: понять, что
вот тут — заголовок, тут — список из трёх элементов, а тут — число, а не
строка из цифр. Парсинг — это и есть переход от ленты символов к структуре.

Классический парсинг состоит из двух слоёв. Первый — лексический анализ
(токенизация): лента символов режется на «слова»-токены. Из строки
{"price": 100} получаются токены: открывающая скобка, строка price,
двоеточие, число 100, закрывающая скобка. Второй слой — синтаксический
анализ
: из потока токенов по правилам грамматики собирается дерево —
обычно AST (abstract syntax tree, абстрактное синтаксическое дерево).

Полезные различения, которые часто путают:

Аналогии из жизни

Разбор предложения в школе. Учитель диктует: «Мама мыла раму», ты
подчёркиваешь подлежащее одной чертой, сказуемое — двумя. Ты превратил
цепочку слов в структуру ролей — это буквально парсинг, отсюда и термин.
Где ломается: человек опирается на смысл и контекст, парсер — только на
формальные правила. Фразу «Косил косой косой косой» человек распутает,
классический парсер без семантики — нет: у него либо однозначная грамматика,
либо ошибка разбора.

Сортировочный центр почты. На ленту сыплется поток посылок. Сортировщик
читает у каждой индекс, город, улицу — и раскладывает по контейнерам. Из
хаотичного потока получается структура «регион → город → отделение».
Где ломается: посылка с нечитаемым адресом уходит в ручной разбор, и
процесс не останавливается. А строгий парсер на первой же «нечитаемой
посылке» падает с ошибкой на весь файл — если его специально не научили
пропускать плохие записи. Обработка ошибок в парсере — отдельная работа,
которая «бесплатно» не даётся.

Приготовление по рецепту из книги. Рецепт — это текст: «взбить 3 яйца,
добавить 200 г муки». Читая, ты выделяешь ингредиенты, количества, действия
и порядок — строишь в голове план готовки. Текст стал структурой.
Где ломается: рецепт рассчитан на додумывание — «соль по вкусу», «жарить
до готовности». Человек заполняет пробелы опытом, парсер не может: формат
должен быть определён полностью, любая двусмысленность — это либо ошибка,
либо жёсткое правило по умолчанию, зашитое заранее.

Как это работает

Разберём на маленьком примере. Есть строка JSON:

{"name": "Prime", "rooms": [1, 2]}

Шаг 1. Лексер (tokenizer, токенизатор). Идёт по символам слева направо
и режет ленту на токены — минимальные осмысленные кусочки:

{  "name"  :  "Prime"  ,  "rooms"  :  [  1  ,  2  ]  }

Каждый токен получает тип: LBRACE (открывающая фигурная скобка), STRING,
COLON, NUMBER и так далее. Уже здесь ловится часть ошибок: строка без
закрывающей кавычки — ошибка лексера.

Шаг 2. Парсер. Читает поток токенов и сверяет его с грамматикой.
Грамматика JSON говорит примерно следующее: «объект — это {, затем ноль
или больше пар "строка: значение" через запятую, затем }; значение — это
строка, число, объект, массив, true, false или null». Замечай рекурсию:
значение может быть объектом, внутри которого снова значения. Именно
рекурсия делает regex бессильным и требует настоящего парсера.

По ходу разбора строится дерево:

        объект
        /    \
   name       rooms
     |          |
  "Prime"    массив
              /  \
             1    2

Шаг 3. Дальше — по назначению. Для данных (JSON, YAML) дерево сразу
превращается в объекты языка: словарь, список, число. Для языков
программирования после синтаксиса идёт семантический анализ: проверка
типов, областей видимости («а объявлена ли переменная x?») — это уже за
пределами парсинга, но живёт рядом.

Два слова о стратегиях, которые встречаются в статьях:

Практический вывод из этой кухни: если формат стандартный — JSON, YAML,
XML, CSV, HTML — свой парсер писать не нужно никогда. Берёшь готовый:
json.loads в Python, BeautifulSoup или lxml для HTML. Все тонкости —
кодировки, экранирование, вложенность, битые данные — там уже решены.

Не парси HTML регулярными выражениями

Классические грабли: «достану цену со страницы регуляркой». Работает до первой смены вёрстки или вложенного тега. HTML — рекурсивный формат, ему нужен HTML-парсер (BeautifulSoup, lxml), который строит дерево тегов. Регулярка годится максимум для точечного выхватывания простых подстрок из уже найденного куска.

Где встречается в обычной жизни

Где встречается в IT и бизнесе

Кто пользуется

Альтернативы и конкуренты

Когда НЕ стоит использовать

Парсер — это всегда договор о формате

Парсинг работает ровно до тех пор, пока источник соблюдает формат. Если формат зафиксирован стандартом (JSON, RFC) — парсер живёт годами. Если формат — чужая вёрстка, которую никто тебе не обещал, закладывай расходы на поддержку: мониторинг поломок и регулярную починку. Это не баг, это природа задачи.

Связанные понятия

Литература и источники

Где встретилось у меня

Вчера в работе крутились агенты, которые собирают подменные номера
колл-трекинга со страниц застройщиков: скачанные страницы разбираются на
структуру, из них извлекаются телефоны по гео-логике. Параллельно журнал
проектов сам парсил jsonl-логи рабочих сессий, превращая их в структурные
записи «что решили и почему». День прошёл под знаком превращения сырого
текста в структуру — это парсинг и есть.

Краткое резюме