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