
Экспорт 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 является основой извлечения данных. Этот простой подход прекрасно подходит для простых, хорошо структурированных таблиц без объединенных ячеек или сложного форматирования.
Пошаговая реализация:
-
Парсинг HTML с BeautifulSoup
-
BeautifulSoup(html, ‘html.parser’) преобразует строку HTML в объект, который можно разобрать.
-
.find(‘table’) находит первую таблицу в HTML.
-
-
Инициализация Excel-книги
-
Workbook() создает новую Excel-книгу.
-
Worksheets[0] получает первый лист (имя по умолчанию «Sheet1»).
-
-
Процесс передачи данных
-
Вложенные циклы перебирают каждую строку (<tr>) и ячейку (<td>/<th>).
-
sheet.Range[row, col].Text записывает содержимое ячейки в Excel.
-
-
Форматирование и сохранение
-
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/
Добавить комментарий