Парсинг данных в Python: от простых строк до датасетов

от автора

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

В этой статье мы разберём основы парсинга данных в 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/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *