Как экспортировать HTML-таблицы в Excel с помощью Python

от автора

Экспорт HTML-таблиц в Excel — это распространенная задача в обработке данных, отчетности и автоматизации. Независимо от того, работаете ли вы с данными, полученными с веб-страниц, панелями управления или отчетами на основе HTML, преобразование таблиц в формат Excel может облегчить анализ данных и их обмен.

В этом блоге мы рассмотрим:

  • Экспорт простых HTML-таблиц

  • Работа с объединенными ячейками

  • Экспорт нескольких таблиц на отдельные листы

  • Расширенные параметры

1. Установка необходимых библиотек

Для начала установите необходимые пакеты Python:

pip install spire.xls.free beautifulsoup4

Почему эти библиотеки?

  • BeautifulSoup (bs4): Парсит HTML-контент и извлекает данные таблиц.

  • Free Spire.XLS for Python: Создает, изменяет и сохраняет Excel-файлы с форматированием.

Примечание: Бесплатная версия Spire.XLS имеет некоторые ограничения, но хорошо подходит для базовых и промежуточных операций с Excel.

2. Экспорт простой таблицы из HTML в Excel

Преобразование базовых HTML-таблиц в Excel является основой извлечения данных. Этот простой подход прекрасно подходит для простых, хорошо структурированных таблиц без объединенных ячеек или сложного форматирования.

Пошаговая реализация:

  1. Парсинг HTML с BeautifulSoup

    • BeautifulSoup(html, ‘html.parser’) преобразует строку HTML в объект, который можно разобрать.

    • .find(‘table’) находит первую таблицу в HTML.

  2. Инициализация Excel-книги

    • Workbook() создает новую Excel-книгу.

    • Worksheets[0] получает первый лист (имя по умолчанию «Sheet1»).

  3. Процесс передачи данных

    • Вложенные циклы перебирают каждую строку (<tr>) и ячейку (<td>/<th>).

    • sheet.Range[row, col].Text записывает содержимое ячейки в Excel.

  4. Форматирование и сохранение

    • AutoFitColumns() автоматически подстраивает ширину столбцов.

    • SaveToFile() экспортирует в формат XLSX.

Полный пример кода

from bs4 import BeautifulSoup  from spire.xls import Workbook, ExcelVersion  # Пример HTML (замените на свой HTML-контент или получите из URL/файла)  html = """  <html>  <head>      <style>          table {              border-collapse: collapse;          }          th, td {              border: 1px solid #000;              padding: 8px;              text-align: left;          }      </style>  </head>  <body>      <table>          <tr>              <th>Product ID</th>              <th>Name</th>              <th>Category</th>              <th>Price ($)</th>              <th>Stock</th>          </tr>          <tr>              <td>1001</td>              <td>Wireless Mouse</td>              <td>Electronics</td>              <td>24.99</td>              <td>150</td>          </tr>          <tr>              <td>1002</td>              <td>Mechanical Keyboard</td>              <td>Electronics</td>              <td>89.99</td>              <td>75</td>          </tr>          <tr>              <td>1003</td>              <td>Desk Lamp</td>              <td>Home</td>              <td>35.50</td>              <td>200</td>          </tr>          <tr>              <td>1004</td>              <td>Notebook</td>              <td>Office</td>              <td>12.00</td>              <td>300</td>          </tr>      </table>  </body>  </html>  """  # Парсинг HTML и нахождение первой таблицы  soup = BeautifulSoup(html, "html.parser")  first_table = soup.find("table")   # Инициализация Spire.XLS книги  workbook = Workbook()  # Получение первого рабочего листа  sheet = workbook.Worksheets[0]  # Цикл по ячейкам в HTML-таблице и запись в Excel  for row_idx, row in enumerate(first_table.find_all("tr")):      for col_idx, cell in enumerate(row.find_all(["th", "td"])):          sheet.Range[row_idx + 1, col_idx + 1].Text = cell.get_text()  # Автоматическая подстройка ширины столбцов  sheet.AllocatedRange.AutoFitColumns()  # Сохранение в Excel  workbook.SaveToFile("HtmlTableToExcel.xlsx", ExcelVersion.Version2016)  workbook.Dispose()

3. Экспорт таблицы с объединенными ячейками в Excel

Хотя базовые таблицы просты, объединенные ячейки требуют специальной обработки. Этот раздел основан на предыдущих знаниях для решения более сложных структур HTML-таблиц.

Как обрабатывать объединенные ячейки:

  • Обнаружение объединенных ячеек

    • Объединенные ячейки в HTML используют:

      • colspan=»N» (горизонтальное объединение по столбцам)

      • rowspan=»N» (вертикальное объединение по строкам).

    • Используйте cell.get(«colspan», 1) и cell.get(«rowspan», 1) для проверки на объединенные ячейки.

    • По умолчанию используйте 1, если атрибут отсутствует.

  • Применение объединения в Excel

    • Используйте sheet.Range[start_row, start_col, end_row, end_col].Merge() для объединения ячеек в Excel.

    • Пример: colspan=»2″ → Объединить по 2 столбца.

  • Пропуск объединенных ячеек

    • Отслеживайте объединенные ячейки в skip_cells, чтобы избежать повторной записи данных в них.

Полный пример кода

from bs4 import BeautifulSoup  from spire.xls import Workbook, ExcelVersion  # Пример HTML с объединенными ячейками (colspan/rowspan)  html = """  <table border="1">    <tr>      <th colspan="2">Merged Header</th>      <th>Normal Header</th>    </tr>    <tr>      <td rowspan="2">Merged Row</td>      <td>Cell A</td>      <td>Cell B</td>    </tr>    <tr>      <td>Cell C</td>      <td>Cell D</td>    </tr>  </table>  """  # Парсинг HTML и нахождение первой таблицы  soup = BeautifulSoup(html, "html.parser")  table = soup.find("table")  # Инициализация Excel  workbook = Workbook()  sheet = workbook.Worksheets[0]  # Отслеживание объединенных ячеек для пропуска их позже  skip_cells = set()  # Цикл по HTML-строкам и ячейкам  for row_idx, row in enumerate(table.find_all("tr")):      col_idx = 1  # Столбцы Excel начинаются с 1      for cell in row.find_all(["th", "td"]):          # Пропуск уже объединенных ячеек          while (row_idx + 1, col_idx) in skip_cells:              col_idx += 1          # Получение значений colspan/rowspan (по умолчанию 1, если не указано)          colspan = int(cell.get("colspan", 1))          rowspan = int(cell.get("rowspan", 1))          # Запись значения ячейки в Excel          sheet.Range[row_idx + 1, col_idx].Text = cell.get_text(strip=True)          # Объединение ячеек, если colspan/rowspan > 1          if colspan > 1 or rowspan > 1:              end_row = row_idx + rowspan              end_col = col_idx + colspan - 1              sheet.Range[row_idx + 1, col_idx, end_row, end_col].Merge()              # Отметьте объединенные ячейки для пропуска              for r in range(row_idx + 1, end_row + 1):                  for c in range(col_idx, end_col + 1):                      if r != row_idx + 1 or c != col_idx:  # Пропустить основную ячейку                          skip_cells.add((r, c))          col_idx += colspan  # Автоматическая подстройка ширины столбцов  sheet.AllocatedRange.AutoFitColumns()  # Сохранение в Excel  workbook.SaveToFile("MergedCellsToExcel.xlsx", ExcelVersion.Version2016)  workbook.Dispose()

4. Экспорт нескольких таблиц на отдельные листы

Данные из реального мира часто поступают в нескольких связанных таблицах. Эта продвинутая техника организует разрозненные наборы данных в структурированную Excel-книгу.

Как работать с несколькими таблицами:

  • Нахождение всех таблиц

    • soup.find_all(‘table’) сканирует HTML-документ и возвращает список всех элементов таблицы.

    • Работает с вложенными таблицами и таблицами с различными структурами.

  • Подготовка книги

    • Worksheets.Clear() удаляет пустой лист по умолчанию для чистого начала.

    • Выполняется только при наличии таблиц (если len(tables) > 0).

  • Создание организованных рабочих листов

    • Генерирует отдельные листы для каждой HTML-таблицы.

    • Автоматически нумерует листы (Таблица 1, Таблица 2).

    • Сохраняет оригинальную структуру таблицы и взаимосвязи данных.

Полный пример кода

from bs4 import BeautifulSoup  from spire.xls import Workbook, ExcelVersion  # Пример HTML с несколькими таблицами  html = """  <html>  <head>      <style>          table {              border-collapse: collapse;          }          th, td {              border: 1px solid #000;              padding: 8px;              text-align: left;          }      </style>  </head>  <body>      <h2>Products</h2>      <table>          <tr>              <th>Product ID</th>              <th>Name</th>              <th>Category</th>              <th>Price ($)</th>              <th>Stock</th>          </tr>          <tr>              <td>1001</td>              <td>Wireless Mouse</td>              <td>Electronics</td>              <td>24.99</td>              <td>150</td>          </tr>      </table>      <h2>Customers</h2>      <table>          <tr>              <th>Customer ID</th>              <th>Name</th>              <th>Email</th>          </tr>          <tr>              <td>2001</td>              <td>John Smith</td>              <td>john@example.com</td>          </tr>      </table>  </body>  </html>  """  # Парсинг HTML и нахождение всех таблиц  soup = BeautifulSoup(html, "html.parser")  tables = soup.find_all("table")  # Инициализация Spire.XLS книги  workbook = Workbook()  # Удаление листа по умолчанию, если есть таблицы для обработки  if len(tables) > 0:      workbook.Worksheets.Clear()  # Цикл по каждой HTML-таблице и создание нового рабочего листа для каждой  for table_idx, table in enumerate(tables):      # Создание нового рабочего листа для каждой таблицы      sheet = workbook.Worksheets.Add(f"Table {table_idx + 1}")      # Запись данных таблицы в рабочий лист      for row_idx, row in enumerate(table.find_all("tr")):          for col_idx, cell in enumerate(row.find_all(["th", "td"])):              sheet.Range[row_idx + 1, col_idx + 1].Text = cell.get_text(strip=True)      # Автоматическая подстройка ширины столбцов для текущего листа      sheet.AllocatedRange.AutoFitColumns()  # Сохранение в Excel  workbook.SaveToFile("MultipleHtmlTablesToExcel.xlsx", ExcelVersion.Version2016)

5. Расширенные параметры

A. Получение HTML из URL

Извлечение HTML непосредственно с живых веб-страниц позволяет динамическую обработку данных. Используйте requests для динамического получения HTML:

import requests response = requests.get("https://example.com/tables.html") html = response.text

B. Форматирование Excel (границы, шрифты)

Профессиональное форматирование преобразует сырые данные в отформатированные отчеты. Spire.XLS предоставляет точный контроль над каждым визуальным элементом.

from spire.xls import CellStyle style = sheet.Range[1, 1, 10, 10].Style style.Borders.LineStyle = BorderLineStyle.Thin style.Font.IsBold = True

6. Заключительные слова

Этот гид охватывает основные техники для экспорта HTML-таблиц в Excel с помощью Python. Независимо от того, работаете ли вы с простыми таблицами, объединенными ячейками или несколькими наборами данных, Free Spire.XLS и BeautifulSoup предоставляют надежное решение.


ссылка на оригинал статьи https://habr.com/ru/articles/937412/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *