Как стать автором
Поиск
Написать публикацию
Обновить

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

Время на прочтение11 мин
Количество просмотров448

Экспорт 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 предоставляют надежное решение.

Теги:
Хабы:
0
Комментарии1

Публикации

Ближайшие события