Парсинг документов: обзор форматов, библиотек и подходов

Обзор парсинга документов: PDF, Word, Excel, презентации и сканы — какие библиотеки и подходы работают для каждого формата.

КP
Команда Parsing.agency
Сбор данных под задачи бизнеса
Опубликовано: 28 февраля 2025

Парсинг документов — это извлечение структурированных данных из файлов разных форматов и приведение их к виду, удобному для дальнейшей обработки: загрузки в базу, выгрузки в таблицу, передачи в аналитику или в другую систему. На практике задача почти никогда не сводится к одному формату: прайс приходит в Excel, выгрузка из CRM — в CSV, договор — в PDF, данные стороннего сервиса — в JSON или XML, а карта сайта, которую нужно обойти перед сбором данных, — в формате sitemap.

Эта статья — обзорная. Здесь мы разбираем логику работы с каждым типом файлов, показываем минимальные примеры на разных языках и даём ссылки на профильные материалы, где каждый формат разобран подробно. Если вам нужно решение под конкретную задачу, а не разбираться самостоятельно — мы оказываем услуги парсинга под ключ.

Из чего складывается парсинг любого документа

Независимо от формата процесс почти всегда состоит из трёх шагов. Сначала идёт чтение — получение байтов файла из локальной папки, по URL или из потока. Затем разбор структуры — превращение «сырого» содержимого в объекты языка программирования: дерево узлов, список строк, таблицу. И наконец извлечение и нормализация — выбор нужных полей, очистка от мусора, приведение типов (дат, чисел, валют) и выгрузка результата.

Сложность смещается между этими шагами в зависимости от формата. У строго структурированных данных вроде JSON или XML тяжёлая работа уже сделана за вас — есть формальная грамматика, и парсер гарантированно построит дерево. У слабоструктурированных форматов — PDF, логов, произвольных текстовых файлов — большая часть усилий уходит как раз на третий шаг: данные нужно «вытаскивать» эвристиками и регулярными выражениями.

Структурированные форматы данных

JSON

JSON — самый распространённый формат обмена данными между сервисами и основной ответ большинства API. Он отображается прямо на структуры языка: объект становится словарём (или ассоциативным массивом), массив — списком. Поэтому парсинг сводится к одному вызову стандартной библиотеки, а основная работа начинается дальше — при обходе вложенных структур. Подробный разбор с обработкой вложенности, потоковым чтением больших файлов и типичными ошибками — в отдельной статье про парсинг JSON.

python
import json

with open("data.json", encoding="utf-8") as f:
    data = json.load(f)

print(data["items"][0]["name"])

XML

XML устроен как дерево узлов с тегами, атрибутами и текстом. Он строже и многословнее JSON, но именно на нём построено множество отраслевых стандартов: выгрузки маркетплейсов, банковские форматы, промышленный обмен данными. Для разбора используют либо потоковый подход (когда файл большой), либо построение дерева в памяти с навигацией через XPath. Детали, библиотеки и примеры — в материале про парсинг XML.

RSS и Atom

RSS — это частный случай XML с фиксированной схемой для лент новостей, блогов и подкастов. Технически его можно разбирать любым XML-парсером, но на практике удобнее специализированные библиотеки, которые сразу отдают список записей с заголовками, датами и ссылками. Подробности — в статье про парсинг RSS.

Sitemap (карта сайта)

Sitemap — ещё один XML-формат, описывающий список URL сайта для поисковых систем и краулеров. Перед сбором данных с большого сайта карту почти всегда обходят первой: она даёт готовый перечень страниц, иногда с датами обновления и приоритетами, и избавляет от слепого обхода ссылок. Как читать обычные и вложенные карты (sitemap index), учитывать lastmod и работать с gzip-версиями — в статье про парсинг sitemap.

Табличные форматы

CSV

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

python
import csv

with open("prices.csv", encoding="utf-8", newline="") as f:
    for row in csv.DictReader(f):
        print(row["sku"], row["price"])

Excel (XLSX, XLS)

Excel — это уже не текст, а бинарный (или, в случае XLSX, упакованный в ZIP) формат с листами, формулами, форматами ячеек и объединёнными областями. Здесь нельзя просто прочитать файл как строки: нужны библиотеки, понимающие внутреннюю структуру книги. Часто исходный прайс или отчёт удобнее сначала привести к CSV, а затем обрабатывать единообразно. Как читать листы, объединённые ячейки и значения формул — в материале про парсинг Excel.

Слабоструктурированные форматы

PDF

PDF — формат для печати и просмотра, а не для хранения данных, поэтому из него сложнее всего извлекать информацию надёжно. Текст в PDF может быть «настоящим» (выбираемым) или картинкой, требующей OCR; таблицы хранятся не как таблицы, а как набор линий и текстовых блоков с координатами. Какие библиотеки извлекают текст, какие — таблицы, и когда без распознавания изображений не обойтись, разобрано в статье про парсинг PDF.

HTML

HTML по структуре близок к XML, но на практике почти всегда «грязный»: незакрытые теги, лишняя вёрстка, динамический контент. Это основной формат при сборе данных с сайтов — извлечение текста, ссылок, цен и контактов. Разбор парсеров, CSS-селекторов и работы со ссылками — в статье про парсинг HTML.

TXT и логи

Произвольные текстовые файлы (.txt) и логи серверов не имеют общей схемы вообще — их формат задаёт тот, кто файл создал. Здесь главные инструменты это построчное чтение и регулярные выражения. Логи — настолько частный и важный случай, что им посвящена отдельная статья; а общий подход к разбору текста описан в материале про парсинг TXT.

Какой язык и стек выбрать

Жёсткого «правильного» выбора нет, но есть сложившаяся практика. Python — фактический стандарт для парсинга: богатые библиотеки под все форматы (pandas, lxml, openpyxl, pdfplumber) и минимум кода. JavaScript/Node.js удобен, когда парсинг встроен в веб-проект или нужен браузерный рендеринг динамики. PHP часто выбирают, если данные сразу попадают в сайт на этом стеке. Go берут ради скорости и параллельной обработки больших объёмов. В каждой профильной статье мы приводим примеры сразу на нескольких языках, чтобы можно было взять ближе к своему проекту.

Объединяет все эти стеки одно: формат диктует библиотеку, а не наоборот. Поэтому начинать стоит с точного определения формата исходных файлов — а дальше переходить в соответствующую статью: JSON, XML, RSS, sitemap, CSV, Excel, PDF, HTML, TXT или логи.