pandas.read_html(), а если нужно больше контроля — через BeautifulSoup.

Когда я впервые столкнулся с задачей «вытащить данные из таблицы на сайте», думал, что придётся писать километры кода. Оказалось — всё намного проще.
Python даёт два мощных инструмента: один — для быстрого решения «из коробки», второй — когда сайт «не даётся» и нужна тонкая настройка.
Оглавление
В этой статье покажу оба подхода на живых примерах: от простого парсинга до сохранения данных в Excel. Всё — без лишней теории, только рабочий код.
Почему парсить таблицы — это полезно?
Таблицы — один из самых частых способов публикации структурированных данных:
- курсы валют
- рейтинги компаний
- расписания, прайсы, статистика
- результаты исследований
Если данные в HTML-таблице — вы можете автоматически собрать их в DataFrame, проанализировать или экспортировать. И делать это регулярно.
Как выглядит HTML-таблица
Прежде чем парсить — полезно понять структуру. Простая таблица в HTML:
<table>
<thead>
<tr><th>Имя</th><th>Возраст</th></tr>
</thead>
<tbody>
<tr><td>Анна</td><td>28</td></tr>
<tr><td>Борис</td><td>34</td></tr>
</tbody>
</table>
Браузер отображает её как:
| ИМЯ | ВОЗРАСТ |
| Анна | 28 |
| Борис | 34 |
Способ 1: pandas.read_html() — всё в одну строку
Самый быстрый способ — функция pandas.read_html(). Она автоматически находит все таблицы на странице и возвращает список DataFrame.
Установка
pip install pandas lxml html5lib
lxmlиhtml5lib— парсеры, которые использует pandas под капотом.
Пример кода
import pandas as pd
url = "https://en.wikipedia.org/wiki/List_of_countries_by_population"
tables = pd.read_html(url)
print(f"Найдено таблиц: {len(tables)}")
df = tables[0] # первая таблица
print(df.head())
✅ Плюсы:
- Ноль ручного парсинга
- Работает почти со всеми «нормальными» таблицами
- Сразу получаете
DataFrame
❌ Минусы:
- Не работает с динамическими таблицами (подгружаемыми через JavaScript)
- Может «потеряться», если таблиц несколько и они похожи
💡 Подсказка: если не уверены, какая таблица нужна — выведите
len(tables)и посмотритеtables[i].head()для каждогоi.
Способ 2: BeautifulSoup — когда нужен контроль
Если read_html() не справляется (например, таблица вложена в сложную структуру или данные «спрятаны»), берём BeautifulSoup.
Установка
pip install beautifulsoup4 requests pandas
Пример: извлечь таблицу по CSS-селектору
import requests
from bs4 import BeautifulSoup
import pandas as pd
url = "https://example-table-site.com"
response = requests.get(url)
soup = BeautifulSoup(response.content, "html.parser")
# Находим таблицу по селектору (например, классу)
table = soup.select_one("table.wikitable") # как на Wikipedia
# Парсим строки
rows = []
for tr in table.find_all("tr"):
cells = [td.get_text(strip=True) for td in tr.find_all(["td", "th"])]
if cells:
rows.append(cells)
# Создаём DataFrame
df = pd.DataFrame(rows[1:], columns=rows[0]) # первая строка — заголовки
print(df.head())
🔍 Как найти селектор? Откройте DevTools (F12), наведите на таблицу → «Просмотреть код» → скопируйте селектор.
✅ Плюсы:
- Полный контроль над процессом
- Работает с «косыми» таблицами
- Можно извлекать атрибуты (
href,data-*и т.д.)
Сохранение данных: CSV и Excel
После парсинга данные легко сохранить:
# В CSV
df.to_csv("data.csv", index=False)
# В Excel (требуется openpyxl)
df.to_excel("data.xlsx", index=False, engine="openpyxl")
⚠️ Для Excel установите:
pip install openpyxl
Практический пример: парсим таблицу с Wikipedia
Попробуем извлечь топ-10 стран по населению:
import pandas as pd
url = "https://en.wikipedia.org/wiki/List_of_countries_by_population_(United_Nations)"
tables = pd.read_html(url, match="Country or area") # ищем по ключевому слову
df = tables[0]
df = df.head(10)[["Country or area", "UN estimate"]] # оставляем нужные столбцы
df.to_csv("top_10_population.csv", index=False)
print("✅ Данные сохранены в top_10_population.csv")
Такой скрипт можно запускать раз в неделю — и у вас всегда свежая статистика.
Заключение
pandas.read_html()— ваш выбор, если таблица «простая» и статичная.- BeautifulSoup + pandas — когда нужна гибкость или данные «спрятаны».
- Оба способа дают готовый DataFrame, который можно анализировать, визуализировать или экспортировать.
С этими инструментами вы сможете автоматизировать сбор данных из десятков источников — без ручного копирования.
📚 Документация:
Если что-то осталось непонятным — пишите в комментариях! С радостью уточню, дополню или помогу с вашим кодом.
А чтобы не пропустить новые простые и полезные гайды по Python, автоматизации и разработке — подписывайтесь на мой Telegram-канал 🐍
Ваш интерес — лучшая мотивация для новых статей!