Что будем делать

В этой статье мы разберём основы парсинга данных в Python. Мы начнём с простых строк с помощью регулярных выражений, перейдём к парсингу HTML с использованием библиотеки BeautifulSoup, познакомимся с pandas для работы с данными и, наконец, соберём всё вместе, чтобы спарсить реальный датасет (например, топ фильмов с IMDb) и сохранить его в CSV-файл.

Все примеры будут сопровождаться кодом на Python, который вы можете запустить самостоятельно. Для выполнения кода вам понадобится установить необходимые библиотеки: beautifulsoup4 requests pandas на python и соответственно сам python (желательно версии 3> но мне вообще все равно какая у вас версия).

Библиотеки можно поставить с помощью pip: pip install beautifulsoup4 requests pandas

1. Парсим простую строку при помощи регулярных выражений

Регулярные выражения (regex) — это мощный инструмент для поиска и извлечения подстрок из текста по шаблонам. В Python для этого используется модуль re.

Простой пример

Допустим, у нас есть строка с email-адресами, и мы хотим извлечь первый email.

import re

text = "Мои emails: example@mail.com и test@domain.ru"
pattern = r"\b[A-Za-z0-9.\_%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b"

emails = re.findall(pattern, text)

print(emails[0]) # Вывод: example@mail.com

Здесь шаблон ищет типичную структуру email: имя@домен.точка.домен.

Более сложный пример

Теперь извлечём даты в формате ДД.ММ.ГГГГ из текста, включая валидацию (день от 01 до 31, месяц от 01 до 12).

import re

text = "Даты: 15.08.2023, 32.13.2024 (невалидная), 01.01.2025"
pattern = r"\b(0[1-9]|[12][0-9]|3[01])\.(0[1-9]|1[0-2])\.(20[0-9]{2})\b"

dates = re.findall(pattern, text)

print(dates) # Вывод: [('15', '08', '2023'), ('01', '01', '2025')]

Этот шаблон использует альтернативы для дней и месяцев, чтобы избежать невалидных дат.

2. Парсим HTML (при помощи BeautifulSoup)

BeautifulSoup — это популярная Python-библиотека для парсинга HTML и XML документов. Она позволяет легко навигировать по структуре страницы, искать элементы по тегам, классам и атрибутам. Кратко: устанавливается через pip install beautifulsoup4, работает с парсерами вроде 'html.parser' или 'lxml'.

Простой пример

Извлечём заголовок из простого HTML.

from bs4 import BeautifulSoup

html = """
<html>
 <head><title>Пример страницы</title></head>
 <body><h1>Заголовок</h1></body>
</html>
"""

soup = BeautifulSoup(html, "html.parser")
title = soup.find("title").text

print(title) # Вывод: Пример страницы

Здесь мы создаём объект Soup и ищем тег title.

Более сложный пример

Извлечём список ссылок из HTML с классом 'link'.

from bs4 import BeautifulSoup

html = """
<html>
  <head><title>Пример страницы</title></head>
  <body><h1>Заголовок</h1></body>
</html>
"""

soup = BeautifulSoup(html, "html.parser")
title = soup.find("title").text

print(title)  # Вывод: Пример страницы

Мы фильтруем ссылки по классу и извлекаем атрибут href.

3. Знакомство с библиотекой pandas

Pandas — это библиотека для анализа и манипуляции данными в Python. Она предоставляет структуры данных вроде DataFrame (таблицы) и Series (столбцы), а также функции для чтения/записи файлов (CSV, Excel и т.д.), фильтрации, агрегации и визуализации.

Самые базовые и основные концепции:

  • DataFrame: Двумерная таблица с метками строк и столбцов.

  • Series: Одномерный массив с метками.

Пример создания DataFrame:

import pandas as pd

data = {
   "Имя": ["Алиса", "Боб", "Чарли"],
   "Возраст": [25, 30, 35],
   "Город": ["Москва", "СПб", "Казань"]
}

df = pd.DataFrame(data)
print(df)

# Вывод:
# Имя Возраст Город
# 0 Алиса 25 Москва
# 1 Боб 30 СПб
# 2 Чарли 35 Казань

Вы можете фильтровать: df[df['Возраст'] > 28], или сохранять: df.to_csv('file.csv').

4. Соберём всё вместе и попробуем парсить датасет

Теперь объединим всё: используем requests для получения HTML страницы, BeautifulSoup для парсинга, регулярные выражения при необходимости, и pandas для создания DataFrame. В качестве нейтрального примера спарсим топ-10 фильмов с IMDb (названия, годы выпуска и рейтинги). URL: https://www.imdb.com/chart/top/.

Важно: Парсинг сайтов может нарушать их правила. Это для образовательных целей. Структура страницы может измениться.

from bs4 import BeautifulSoup

import requests
import pandas as pd
import re


# Получаем HTML
url = "https://www.imdb.com/chart/top/"
headers = {"User-Agent": "Mozilla/5.0"}  # Чтобы избежать блокировки (на всякий случай, используем в образовательных целях)
response = requests.get(url, headers=headers)
html = response.text

soup = BeautifulSoup(html, "html.parser")

movies = []
items = soup.find_all("li", class_="ipc-metadata-list-summary-item", limit=10)  # Топ-10

for item in items:
    title_elem = item.find("h3", class_="ipc-title__text")
    if title_elem:
        # Извлекаем название
        full_title = title_elem.text.strip()
        match = re.match(r"^\d+\.\s*(.+?)\s*\((\d{4})\)", full_title)
        if match:
            name = match.group(1)
        else:
            name = full_title
    else:
        name = "N/A"

    rating_elem = item.find("span", class_="ipc-rating-star--imdb")
    rating = rating_elem.text.strip() if rating_elem else "N/A"

    movies.append({"Название": name, "Рейтинг": rating})

# Создаём DataFrame
df = pd.DataFrame(movies)
print(df)
# Пример вывода:
#         Название              Рейтинг
# 0  The Shawshank Redemption   9.3
# 1  The Godfather              9.2
# ... (зависит от актуальных данных)

# Сохраняем в CSV
df.to_csv("top10_movies.csv", index=False)
print("Данные сохранены в top10_movies.csv")

Этот код получает страницу, парсит топ-10 фильмов, использует regex для разделения названия и года, создаёт DataFrame, выводит его и сохраняет в CSV. Если структура IMDb изменится, код может потребовать корректировки.

В завершение немного о статье и обо мне:

Это моя первая статья и на Хабре и вообще, может быть она была немного не качественная, может быть была вода местами.

В статье были описаны не все методы и функции использования библиотек, далеко не все, их конечно гораздо больше. Скорее всего в будущем напишу в дополнение к этой статье, статьи на каждую библиотеку.

Приятно познакомится, Хабр!

Комментарии (4)


  1. alex-dev2
    24.08.2025 06:09

    Сильно простецкая статья. Базовые вещи бы рассмотреть - авторизацию, использование прокси


    1. hulitolku
      24.08.2025 06:09

      И обход капч.


  1. danilovmy
    24.08.2025 06:09

    Не будут найдены даты типа 1.1.2026 или 1. Jan 2026 как тут: https://www.sozialministerium.gv.at/Services/Aktuelles/Archiv-2025/teilpension.html

    А это значит, что для парсинга законодательных проектов советы в статье не сработают.

    Советы из статьи в принципе не работают: парсинг не так делается. Я давно жду комментарии и статьи от людей, кто и правда что то такое делает. Со scrapy, желательно.


    1. eeeeeeeeeeee
      24.08.2025 06:09

      Не будут найдены даты типа 1.1.2026 или 1. Jan 2026 как тут: https://www.sozialministerium.gv.at/Services/Aktuelles/Archiv-2025/teilpension.html

      А это значит, что для парсинга законодательных проектов советы в статье не сработают.

      Считаю, что это не совсем корректная критика автора. Скрейпинг того или иного ресурса - всегда разный скрипт. Это нормально, что один прием может сработать на одном сайте, но на другом - нет

      Советы из статьи в принципе не работают: парсинг не так делается. Я давно жду комментарии и статьи от людей, кто и правда что то такое делает. Со scrapy, желательно.

      В принципе, подход автора сработает, если владелец сайта не против, чтобы его спарсили (нет JS, капчи и прочей защиты от ботов, авторизации, щедро раскиданы ARIA-атрибуты). А если владелец сайта против, то лично у меня уже на правовом моменте опускаются руки :D (натыкался на статью на эту тему https://habr.com/ru/articles/545818). Знаю, что через Selenium успешно обходят всё это дело (даже крутых антиботов от Cloudflare). Всякие прокси, сервисы для обхода капч и кастомные драйверы для Selenium сверху прилагаются само собой. Но всё равно сфера скрейпинга в правовом плане мутная. Для себя я решил в неё не соваться. Не уверен даже, что обсуждение инструментов для скрейпинга не попадет в будущем под цензуру по аналогии с VPN. Думаю, по той же причине на хабре и статей не густо