Если данные на сайте уже показаны в виде таблицы, кажется, что их легко забрать автоматически. На практике это не всегда так. Иногда таблица действительно лежит в HTML и читается одной функцией. Но часто оказывается, что у неё сложный заголовок, объединённые ячейки, вложенные элементы или вообще данные подгружаются через JavaScript.
Поэтому парсинг таблиц с сайта на Python — это не только чтение HTML, но и проверка структуры, очистка значений и подготовка результата к дальнейшей работе. Для бизнеса это особенно важно: мало просто собрать строки, нужно ещё выгрузить их в удобный формат и убедиться, что данные не “поехали”.
Для каких бизнесов это особенно актуально
Когда нужен парсинг таблиц
Сбор табличных данных нужен в самых разных задачах:
- мониторинг цен конкурентов;
- выгрузка каталогов и справочников;
- сбор расписаний, тарифов, курсов, рейтингов;
- анализ товарных характеристик;
- подготовка таблиц для BI и отчётности;
- экспорт данных в CSV или Excel для дальнейшей обработки.
Плюс таблиц в том, что структура уже частично задана: есть строки, столбцы, заголовки. Но это не гарантирует, что страница технически устроена удобно для парсинга.
Почему таблицы не всегда парсятся “в один клик”
Самая распространённая ошибка — считать, что любая визуальная таблица на сайте представляет собой обычный тег table. На реальных проектах всё часто сложнее.
Проблемы обычно такие:
- таблица собрана на div, а не на table;
- заголовки занимают несколько строк;
- используются rowspan и colspan;
- часть значений скрыта или раскрывается по клику;
- в ячейках лежат ссылки, иконки, вложенные блоки;
- данные приходят с сервера через JavaScript;
- структура таблицы меняется от страницы к странице.
Из-за этого Python парсинг таблицы HTML часто требует не только извлечения данных, но и ручной логики обработки.
Какие инструменты использовать
Для парсинга данных с сайта Python обычно хватает нескольких основных библиотек.
requests
Используется для загрузки HTML страницы. Подходит, если данные уже присутствуют в исходном коде.
BeautifulSoup
Нужна для разбора DOM. Это удобный вариант, когда нужно вручную пройтись по строкам, колонкам, ссылкам и вложенным элементам.
pandas.read_html()
Самый быстрый способ попробовать считать таблицу. Хорошо работает на простых страницах, где HTML-разметка аккуратная.
lxml
Более быстрый HTML-парсер. Часто используется вместе с BeautifulSoup или отдельно там, где важна производительность.
Selenium или Playwright
Используются, если таблица строится в браузере после загрузки страницы. Это уже сценарий для динамических сайтов.
Практически логика такая: сначала стоит попробовать простой путь, а если таблица нестандартная — переходить к более управляемому разбору.
Базовый процесс парсинга таблицы
Независимо от сайта, обычно процесс выглядит одинаково.
- Проверить, где находятся данные
Сначала нужно понять, есть ли таблица в HTML вообще. Иногда визуально таблица есть, а в исходном коде её нет — значит, данные подгружаются отдельно.
- Изучить структуру страницы
Нужно посмотреть:
- какой тег используется;
- есть ли thead, tbody;
- сколько строк в заголовке;
- есть ли объединённые ячейки;
- одинаковое ли количество колонок в строках.
- Выбрать способ парсинга
Если таблица стандартная, подойдёт pandas.read_html(). Если структура нестабильная, лучше идти через BeautifulSoup.
- Собрать данные
Извлекаются заголовки, затем строки и значения ячеек.
- Очистить результат
После парсинга почти всегда нужно:
- убрать лишние пробелы;
- удалить переносы строк;
- почистить спецсимволы;
- привести числа и даты к нормальному формату.
- Сохранить в нужный формат
Чаще всего нужна выгрузка таблицы в CSV или выгрузка таблицы в Excel.
Простой пример с pandas.read_html()
Если страница содержит обычную HTML-таблицу, можно начать с самого короткого варианта.
import pandas as pd
url = «https://example.com/table-page»
df = pd.read_html(url)[0]
print(df.head())
df.to_csv(«table.csv», index=False, encoding=»utf-8-sig»)
df.to_excel(«table.xlsx», index=False)
Такой подход удобен, когда:
- таблица действительно размечена тегом table;
- заголовки простые;
- нет сложных объединений;
- данные не подгружаются отдельно.
Плюс в том, что это быстро. Минус — меньше контроля над структурой. Поэтому результат нужно проверять вручную.
Пример через BeautifulSoup
Если нужен больший контроль, лучше разбирать таблицу вручную.
import requests
from bs4 import BeautifulSoup
import pandas as pd
url = «https://example.com/table-page»
response = requests.get(url, headers={«User-Agent»: «Mozilla/5.0»}, timeout=20)
response.raise_for_status()
soup = BeautifulSoup(response.text, «lxml»)
table = soup.find(«table»)
rows = []
for tr in table.find_all(«tr»):
cells = tr.find_all([«th», «td»])
row = [cell.get_text(» «, strip=True) for cell in cells]
if row:
rows.append(row)
header = rows[0]
data = rows[1:]
df = pd.DataFrame(data, columns=header)
df.to_csv(«table_bs4.csv», index=False, encoding=»utf-8-sig»)
df.to_excel(«table_bs4.xlsx», index=False)
Этот вариант лучше, когда нужно:
- выбрать конкретную таблицу по классу или id;
- отдельно обработать заголовки;
- извлечь текст и ссылки;
- дополнительно очистить содержимое ячеек.
Для реальных задач BeautifulSoup таблица часто даёт более предсказуемый результат, чем автоматическое чтение всех таблиц со страницы.
Как выгружать в CSV и Excel
После парсинга данные обычно нужно сохранить так, чтобы с ними можно было работать дальше.
CSV
CSV — простой формат для обмена и загрузки в аналитику.
df.to_csv(«output.csv», index=False, encoding=»utf-8-sig»)
Что важно:
- для русского текста лучше использовать utf-8-sig;
- иногда нужен разделитель ;, а не запятая;
- числа лучше заранее приводить к числовому типу.
Excel
Excel удобен, если таблицу будут проверять вручную.
df.to_excel(«output.xlsx», index=False)
Для бизнеса Excel часто удобнее, потому что файл можно быстро открыть, проверить, передать коллегам и использовать без дополнительных инструментов.
Что делать с нестандартной структурой
Именно здесь обычно начинаются настоящие сложности.
Несколько строк заголовков
Иногда таблица имеет не один заголовок, а два или три уровня. Тогда нельзя просто взять первую строку как header. Нужно отдельно обработать блок заголовков и собрать итоговые названия колонок.
Объединённые ячейки
Если в таблице есть rowspan и colspan, количество ячеек в строках может отличаться. Это приводит к “съехавшим” колонкам. В таких случаях приходится либо писать свою логику разворачивания структуры, либо вручную выравнивать данные.
Неполные строки
Иногда часть строк имеет меньше колонок, чем ожидается. Тогда перед созданием DataFrame строки нужно привести к одинаковой длине.
max_len = max(len(row) for row in rows)
rows =
Вложенные теги и ссылки
Внутри ячеек может быть не только текст. Например, ссылка, иконка, атрибут с дополнительным значением. Если просто брать get_text(), часть данных можно потерять.
Грязные значения
После парсинга часто остаются:
- лишние пробелы;
- переносы строк;
- неразрывные пробелы;
- символы валют;
- проценты в строковом виде.
Простейшая очистка может выглядеть так:
df = df.applymap(lambda x: x.replace(«xa0″, » «).strip() if isinstance(x, str) else x)
Это важный этап, потому что без него даже корректно спарсенная таблица может быть неудобной для дальнейшей работы.
Если таблица загружается через JavaScript
Бывает, что через requests таблица не находится вообще. Это значит, что страница сначала грузит оболочку, а сами данные подставляет позже.
В таком случае есть два основных подхода.
Найти API или XHR-запрос
Это лучший вариант. Если в DevTools видно, что таблица приходит JSON-запросом, лучше брать именно этот источник. Для регулярного парсинга это надёжнее и быстрее.
Использовать браузерную автоматизацию
Если API найти сложно, можно использовать Selenium или Playwright и собирать уже отрендеренную страницу.
from selenium import webdriver
from selenium.webdriver.common.by import By
import pandas as pd
import time
driver = webdriver.Chrome()
driver.get(«https://example.com/dynamic-table»)
time.sleep(3)
table = driver.find_element(By.TAG_NAME, «table»)
rows = table.find_elements(By.TAG_NAME, «tr»)
data = []
for row in rows:
cells = row.find_elements(By.TAG_NAME, «th») + row.find_elements(By.TAG_NAME, «td»)
data.append([cell.text for cell in cells])
driver.quit()
df = pd.DataFrame(data[1:], columns=data[0])
df.to_excel(«dynamic_table.xlsx», index=False)
Этот вариант тяжелее, но иногда без него не обойтись.
Типичные ошибки при парсинге таблиц
Чаще всего проблемы возникают не потому, что код не работает, а потому, что он собирает таблицу некорректно.
Основные ошибки такие:
- парсят только первую страницу и забывают про пагинацию;
- не проверяют, что часть строк скрыта;
- не учитывают сложные заголовки;
- сохраняют данные без очистки;
- не приводят числа и даты к нужному формату;
- не сравнивают выгрузку с таблицей на сайте.
Из-за этого в CSV или Excel попадает формально заполненный файл, но использовать его в аналитике уже неудобно.
Когда это уже не разовый скрипт, а продакшн-задача
Разово спарсить одну таблицу — это одно. Но если нужно собирать такие данные регулярно, задача меняется.
Продакшн-проект начинается там, где нужно:
- регулярно обновлять данные;
- отслеживать изменения структуры сайта;
- валидировать результат;
- хранить историю выгрузок;
- передавать данные в BI, CRM или внутренние отчёты.
В этом случае важен уже не просто код, а стабильный процесс: сбор, проверка, очистка, сохранение, повторный запуск.
Парсинг таблиц с сайта на Python — удобный способ автоматизировать сбор структурированных данных, но реальная сложность зависит от устройства страницы. Простые HTML-таблицы можно быстро собрать через pandas.read_html(). Более сложные кейсы требуют BeautifulSoup, ручной обработки структуры или работы с JavaScript-подгрузкой.
Для бизнеса важен не сам факт парсинга, а корректная выгрузка, которую можно использовать дальше без ручной переделки. Именно поэтому в реальных проектах важны не только библиотеки, но и проверка структуры, очистка значений и правильный экспорт данных в CSV или Excel.
Parsing Master помогает автоматизировать парсинг табличных данных с сайтов, включая нестандартные таблицы, сложную верстку и регулярные выгрузки под аналитику.
Контактная информация:
Компания: ParsingMaster
Сайт: parsingmaster.com
Email: info@parsingmaster.com
Telegram: parsingmaster_manager
Телефон: +7 (920) 909-36-72
Заказать звонок
Чтобы заказать обратный звонок, заполните и отправьте форму ниже.
Оставляя заявку вы можете быть уверены:
От нас не будет никакого спама
Менеджер свяжется с вами в течение 30 мин.
(Рабочее время: Пн-Пт с 9:00 до 18:00 (GMT+3, Мск)
В кратчайшие сроки решим вашу задачу