Парсинг документов — это извлечение структурированных данных из файлов разных форматов и приведение их к виду, удобному для дальнейшей обработки: загрузки в базу, выгрузки в таблицу, передачи в аналитику или в другую систему. На практике задача почти никогда не сводится к одному формату: прайс приходит в Excel, выгрузка из CRM — в CSV, договор — в PDF, данные стороннего сервиса — в JSON или XML, а карта сайта, которую нужно обойти перед сбором данных, — в формате sitemap.
Эта статья — обзорная. Здесь мы разбираем логику работы с каждым типом файлов, показываем минимальные примеры на разных языках и даём ссылки на профильные материалы, где каждый формат разобран подробно. Если вам нужно решение под конкретную задачу, а не разбираться самостоятельно — мы оказываем услуги парсинга под ключ.
Из чего складывается парсинг любого документа
Независимо от формата процесс почти всегда состоит из трёх шагов. Сначала идёт чтение — получение байтов файла из локальной папки, по URL или из потока. Затем разбор структуры — превращение «сырого» содержимого в объекты языка программирования: дерево узлов, список строк, таблицу. И наконец извлечение и нормализация — выбор нужных полей, очистка от мусора, приведение типов (дат, чисел, валют) и выгрузка результата.
Сложность смещается между этими шагами в зависимости от формата. У строго структурированных данных вроде JSON или XML тяжёлая работа уже сделана за вас — есть формальная грамматика, и парсер гарантированно построит дерево. У слабоструктурированных форматов — PDF, логов, произвольных текстовых файлов — большая часть усилий уходит как раз на третий шаг: данные нужно «вытаскивать» эвристиками и регулярными выражениями.
Структурированные форматы данных
JSON
JSON — самый распространённый формат обмена данными между сервисами и основной ответ большинства API. Он отображается прямо на структуры языка: объект становится словарём (или ассоциативным массивом), массив — списком. Поэтому парсинг сводится к одному вызову стандартной библиотеки, а основная работа начинается дальше — при обходе вложенных структур. Подробный разбор с обработкой вложенности, потоковым чтением больших файлов и типичными ошибками — в отдельной статье про парсинг JSON.
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.
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 может быть «настоящим» (выбираемым) или картинкой, требующей 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 или логи.