Что будем делать
В этой статье мы разберём основы парсинга данных в 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 изменится, код может потребовать корректировки.
В завершение немного о статье и обо мне:
Это моя первая статья и на Хабре и вообще, может быть она была немного не качественная, может быть была вода местами.
В статье были описаны не все методы и функции использования библиотек, далеко не все, их конечно гораздо больше. Скорее всего в будущем напишу в дополнение к этой статье, статьи на каждую библиотеку.
Приятно познакомится, Хабр!