Все статьи
Форматы данных

HTML таблицы в CSV: извлечение данных

Как вытащить данные из HTML таблиц в CSV, парсинг таблиц, обработка сложной разметки.

12 февраля 2025
6 мин чтения
ConvertHub
#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-документы часто содержат сущности (&amp;, &nbsp;,&mdash;) и могут быть в любой кодировке. При извлечении текста сущности нужно превратить в символы, а кодировку привести к 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 и не перегружайте сервер запросами.

Попробуйте эти инструменты

Похожие статьи