HTML таблицы в CSV: извлечение данных
Как вытащить данные из HTML таблиц в CSV, парсинг таблиц, обработка сложной разметки.
Введение
HTML-таблицы — один из самых распространённых способов представления табличных данных в вебе. Сайты статистики, отчёты, каталоги, расписания — всё это часто оформлено в виде <table>. Когда нужно проанализировать такие данные в Excel, Google Sheets или скрипте, приходится извлекать их из HTML. В этой статье разберём, как корректно конвертировать HTML таблицы в CSV, какие сложности возникают и какие инструменты выбрать.
Структура HTML-таблицы
HTML-таблица состоит из строк <tr>, в которых находятся ячейки<td> (обычные) и <th> (заголовки). Строки группируются в <thead>, <tbody>,<tfoot>. Пример:
<table>
<thead>
<tr>
<th>Имя</th>
<th>Возраст</th>
<th>Город</th>
</tr>
</thead>
<tbody>
<tr>
<td>Анна</td>
<td>32</td>
<td>Москва</td>
</tr>
<tr>
<td>Борис</td>
<td>45</td>
<td>Санкт-Петербург</td>
</tr>
</tbody>
</table>Эту таблицу нужно превратить в CSV:
Имя,Возраст,Город
Анна,32,Москва
Борис,45,Санкт-ПетербургСложные случаи
Объединённые ячейки
Атрибуты colspan и rowspan объединяют ячейки по горизонтали и вертикали. CSV не поддерживает объединения, поэтому их нужно «развернуть»: значение распространить на все объединённые ячейки. Это нетривиальная задача, требующая отслеживания состояния предыдущих строк.
<table>
<tr>
<td rowspan="2">Группа A</td>
<td>Анна</td>
</tr>
<tr>
<td>Борис</td>
</tr>
</table>Корректный CSV с раскрытием rowspan:
Группа A,Анна
Группа A,БорисВложенные таблицы
В ячейке может быть другая таблица. Простые парсеры просто проигнорируют вложенную структуру или возьмут весь текст ячейки. Серьёзные инструменты предлагают конфигурацию: развернуть вложенную таблицу в несколько строк или проигнорировать её.
HTML внутри ячеек
Ячейки часто содержат ссылки, изображения, выделенный текст. При извлечении в CSV нужно решить: оставить HTML как есть, удалить теги и оставить только текст, или преобразовать в Markdown. Обычно выбирают второй вариант — только текстовое содержимое.
Несколько таблиц на странице
На одной странице может быть несколько таблиц. Хороший конвертер позволяет выбрать конкретную таблицу или экспортировать все в разные CSV-файлы.
Пропущенные ячейки
Иногда авторы HTML-таблиц «забывают» про пустые ячейки и оставляют строки с разным количеством <td>. Корректный парсер должен выравнивать строки по максимальной ширине, добавляя пустые значения.
Инструменты конвертации
Онлайн-конвертер
Самый быстрый способ — наш инструмент HTML таблицы в CSV. Вставляете HTML-код таблицы, инструмент извлекает данные и формирует CSV. Поддерживаются настройки разделителя, обработки заголовков и очистки от тегов. Для обратной задачи есть CSV в HTML таблицу.
JavaScript и браузер
В браузере можно извлечь данные из DOM напрямую. Простой подход — найти все<tr> в таблице и для каждой собрать ячейки:
function tableToCsv(table) {
const rows = table.querySelectorAll('tr');
const lines = [];
for (const row of rows) {
const cells = row.querySelectorAll('th, td');
const values = Array.from(cells).map(c => {
const text = c.textContent.trim().replace(/"/g, '""');
return /[,"\n]/.test(text) ? `"${text}"` : text;
});
lines.push(values.join(','));
}
return lines.join('\n');
}
const table = document.querySelector('table');
const csv = tableToCsv(table);Этот код не обрабатывает colspan и rowspan. Для серьёзных задач используйте библиотеки вроде table-to-csv или парсеры на основеcheerio в Node.js.
Python и pandas
В Python самый простой способ — использовать pandas.read_html, который автоматически находит все таблицы на странице и возвращает их как DataFrame:
import pandas as pd
# Из HTML-строки
tables = pd.read_html(html_string)
df = tables[0] # первая таблица
df.to_csv('output.csv', index=False, encoding='utf-8-sig')
# Из URL
tables = pd.read_html('https://example.com/stats')
df = tables[0]
df.to_csv('output.csv', index=False)pandas.read_html использует lxml или beautifulsoup4под капотом и корректно обрабатывает большинство сложных случаев, включая объединённые ячейки.
Командная строка
В Linux/Unix популярны xq (часть jq) для обработки XML/HTML через XPath и связка curl + python -c. Для одноразовых задач — это быстро.
curl -s https://example.com/stats | python -c "
import sys, pandas as pd
tables = pd.read_html(sys.stdin)
tables[0].to_csv('out.csv', index=False)
"Сценарии использования
- Анализ статистики с сайтов — данные Росстата, World Bank, ООН часто публикуются в HTML-таблицах.
- Парсинг каталогов и прайс-листов — извлечение товарных позиций для конкурентного анализа.
- Расписания и графики — расписание транспорта, мероприятия, курсы валют.
- Отчёты и дашборды — HTML-отчёты из CMS или BI-инструментов.
- Миграция контента — перенос табличных данных между системами.
- Сравнение данных — выгрузка таблицы с сайта и сравнение с собственной базой.
Подводные камни
Динамически генерируемые таблицы
Многие современные сайты подгружают данные через JavaScript. В исходном HTML нет таблицы, она рендерится после выполнения скриптов. Для таких случаев обычный HTTP-запрос и парсинг не подойдут — нужен headless-браузер (Puppeteer, Playwright), который дождётся загрузки.
Кодировка и сущности
HTML-документы часто содержат сущности (&, ,—) и могут быть в любой кодировке. При извлечении текста сущности нужно превратить в символы, а кодировку привести к UTF-8. Библиотеки вроде he в JavaScript или html.unescape в Python решают эту задачу.
Заголовки в tbody
Не все авторы HTML-таблиц используют <thead>. Иногда заголовки находятся в первой строке <tbody> или вообще отсутствуют. Конвертер должен либо распознавать заголовки автоматически (по наличию<th>), либо позволять пользователю указать первую строку как заголовок.
Защита от скрапинга
Многие сайты защищены от автоматического сбора данных: через Cloudflare, CAPTCHA, rate limiting. Перед парсингом проверьте robots.txt и условия использования сайта. Не нарушайте правила и не перегружайте сервер запросами.
Лучшие практики
- Перед конвертацией проверьте структуру таблицы — нет ли rowspan/colspan.
- Указывайте кодировку при чтении и записи (обычно UTF-8).
- Заключайте в кавычки все поля, содержащие запятую, кавычку или перенос строки.
- Декодируйте HTML-сущности в текстовые символы.
- Для нескольких таблиц на странице генерируйте отдельные CSV или используйте маркеры разделения.
- Проверьте лицензию и условия использования данных перед парсингом.
- Кэшируйте результаты парсинга, чтобы не нагружать исходный сайт.
- При работе с динамическими сайтами используйте headless-браузер с разумными задержками.
Связанные инструменты
После извлечения данных в CSV их часто нужно конвертировать в другие форматы. Для JSON-формата читайте CSV в JSON, для импорта в базу данных — CSV в SQL INSERT, для анализа — CSV vs TSV. Если данные нужно очистить от HTML и превратить в Markdown, поможетHTML в Markdown.
Заключение
Конвертация HTML таблиц в CSV — полезный навык при работе с веб-данными. Простые таблицы извлекаются за минуту через онлайн-инструмент ConvertHub или пару строк на pandas. Сложные случаи — объединённые ячейки, вложенные таблицы, динамический контент — требуют серьёзных парсеров и иногда headless-браузера. Главное — корректно обрабатывать структуру, декодировать сущности и приводить кодировку к UTF-8. При работе с чужими сайтами соблюдайте правила и условия использования: не нарушайте robots.txt и не перегружайте сервер запросами.
Попробуйте эти инструменты
Похожие статьи
JSON vs XML — какое выбрать для проекта
Сравнение JSON и XML: синтаксис, размер, скорость парсинга, читаемость. Когда JSON лучше, а когда XML.
JSON форматтер: зачем нужен и как использовать
Что такое форматирование JSON, отступы и пробелы, валидация, minify vs beautify, лучшие практики.
CSV в JSON: конвертация и когда нужна
Как преобразовать CSV в JSON, структура данных, обработка больших файлов, использование в JavaScript.
YAML — конфигурационный формат: полный гид
Синтаксис YAML, отступы, типы данных, отличие от JSON, использование в Docker, Kubernetes, CI/CD.