Парсинг таблиц с сайтов с помощью pandas + BeautifulSoup

📊 Кратко: Научитесь извлекать таблицы с веб-страниц за пару строк кода — сначала через pandas.read_html(), а если нужно больше контроля — через BeautifulSoup.
python парсинг данных,

Когда я впервые столкнулся с задачей «вытащить данные из таблицы на сайте», думал, что придётся писать километры кода. Оказалось — всё намного проще.
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("&#x2705; Данные сохранены в top_10_population.csv")

Такой скрипт можно запускать раз в неделю — и у вас всегда свежая статистика.

Заключение

  • pandas.read_html() — ваш выбор, если таблица «простая» и статичная.
  • BeautifulSoup + pandas — когда нужна гибкость или данные «спрятаны».
  • Оба способа дают готовый DataFrame, который можно анализировать, визуализировать или экспортировать.

С этими инструментами вы сможете автоматизировать сбор данных из десятков источников — без ручного копирования.

📚 Документация:

Если что-то осталось непонятным — пишите в комментариях! С радостью уточню, дополню или помогу с вашим кодом.

А чтобы не пропустить новые простые и полезные гайды по Python, автоматизации и разработке — подписывайтесь на мой Telegram-канал 🐍

Ваш интерес — лучшая мотивация для новых статей!

Оставьте комментарий