HTML-отчёты из Python: просто и красиво

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

PythonРазработка

6 мин

Если твой Python-скрипт обрабатывает данные, логирует ошибки или считает метрики, возникает логичный вопрос: а как удобно сохранить результат?
Идеальный формат — HTML. Он красивый, гибкий и открывается в любом браузере. А ещё — его легко генерировать на лету.

В этой статье мы покажем, как быстро собирать HTML-отчёты в Python. Без фреймворков и лишней магии — только практичные приёмы 💡

🧰 Когда нужен HTML-отчёт?

  • После обработки CSV/Excel данных

  • Для вывода графиков и таблиц

  • При сборе метрик (например, в cron-задачах)

  • Для логов ошибок, обработанных красиво

  • Для хранения отчётов по проекту

📊 Преимущества HTML:

  • Удобно визуализировать

  • Поддерживает стили и графику

  • Открывается на любом устройстве

🛠 Способы генерации HTML

Метод

Подходит для

🔹 Ручная сборка строки

Простые случаи

🔹 Шаблонизаторы (Jinja2)

Гибкие шаблоны

🔹 Pandas .to_html()

Таблицы

🔹 Библиотеки (WeasyPrint, yattag)

Расширенная верстка

🧪 Пример 1: Простой HTML вручную

html = """
<!DOCTYPE html>
<html>
<head><title>Отчёт</title></head>
<body>
  <h1>Пример отчёта</h1>
  <p>Всего пользователей: 25</p>
</body>
</html>
"""

with open("report.html", "w", encoding="utf-8") as f:
    f.write(html)

🧪 Пример 2: Pandas .to_html() для таблиц

import pandas as pd

df = pd.DataFrame({
    "Имя": ["Кодик", "Алиса", "Джон"],
    "Баллы": [85, 90, 78]
})

html_table = df.to_html(index=False)

html = f"""
<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <style>
    table {{ border-collapse: collapse; width: 50%; margin: 20px auto; }}
    th, td {{ border: 1px solid #ccc; padding: 8px; text-align: center; }}
    th {{ background-color: #f2f2f2; }}
  </style>
</head>
<body>
  <h2 style="text-align:center;">Таблица баллов</h2>
  {html_table}
</body>
</html>
"""

with open("report.html", "w", encoding="utf-8") as f:
    f.write(html)

🧪 Пример 3: Jinja2 — шаблоны с данными

from jinja2 import Environment, FileSystemLoader

data = {"users": [{"name": "Кодик", "score": 88}, {"name": "Лена", "score": 95}]}

env = Environment(loader=FileSystemLoader("templates"))
template = env.get_template("report.html")

html = template.render(users=data["users"])

with open("report.html", "w", encoding="utf-8") as f:
    f.write(html)

Шаблон templates/report.html:

<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title>Отчёт</title>
</head>
<body>
  <h1>Баллы пользователей</h1>
  <ul>
    {% for user in users %}
      <li>{{ user.name }} — {{ user.score }}</li>
    {% endfor %}
  </ul>
</body>
</html>

📦 Как добавить графики?

Если ты используешь matplotlib или plotly, можно сохранить график как изображение и вставить его в отчёт:

plt.savefig("chart.png")

html = """
<img src="chart.png" alt="График">
"""

💡 Где пригодится HTML-отчёт

  • 📊 Внутренние отчёты команды

  • 🛠 DevOps-мониторинги (через cron)

  • 💼 Автоматические отчёты клиентам

  • 📁 Архивирование результатов скриптов

🤖 А можно PDF?

Да! Используй WeasyPrint или pdfkit:

pip install weasyprint
from weasyprint import HTML

HTML("report.html").write_pdf("report.pdf")

В приложении Кодик ты найдёшь курсы по Python, HTML и другие.
Создавай шаблоны, визуализируй данные и делай всё красиво — даже если ты только начинаешь.

Присоединяйся также в наш телеграм-сообщества 📬

💬 Напиши, если хочешь увидеть статью про генерацию PDF, интерактивные отчёты или автоматические email-рассылки с HTML-отчётами!

Комментарии