BeautifulSoup — популярна бібліотека Python для розбору HTML. Вона добре підходить для сторінок, де потрібні дані вже є у коді, і працює в парі з бібліотекою requests. У статті — повний робочий приклад і поради, як зробити парсер стабільним.
Встановлення
pip install requests beautifulsoup4 lxml
Пакет lxml необов’язковий, але прискорює розбір і краще працює з «неідеальною» розміткою.
Мінімальний приклад
import requests
from bs4 import BeautifulSoup
url = "https://example.com/catalog"
headers = {"User-Agent": "Mozilla/5.0 (compatible; MyParser/1.0)"}
resp = requests.get(url, headers=headers, timeout=20)
resp.raise_for_status()
soup = BeautifulSoup(resp.text, "lxml")
for card in soup.select("div.product-card"):
title = card.select_one("a.title").get_text(strip=True)
price = card.select_one("span.price").get_text(strip=True)
link = card.select_one("a.title")["href"]
print(title, price, link)
Як вибирати елементи
select() і select_one() приймають CSS-селектори: .price, div.card a, [data-id].find() і find_all() шукають за назвою тега й атрибутами.get_text(strip=True) повертає чистий текст, tag["href"] — значення атрибута.
Селектор зручно перевіряти у браузері: натисніть F12, клікніть правою кнопкою на елементі й виберіть Copy → Copy selector.
Обхід кількох сторінок
import time
rows = []
for page in range(1, 6):
resp = requests.get(f"https://example.com/catalog?page={page}", headers=headers, timeout=20)
soup = BeautifulSoup(resp.text, "lxml")
for card in soup.select("div.product-card"):
rows.append({
"title": card.select_one("a.title").get_text(strip=True),
"price": card.select_one("span.price").get_text(strip=True),
})
time.sleep(1.5)
Збереження у CSV
import csv
with open("products.csv", "w", newline="", encoding="utf-8-sig") as f:
writer = csv.DictWriter(f, fieldnames=["title", "price"])
writer.writeheader()
writer.writerows(rows)
Кодування utf-8-sig дозволяє відкрити файл в Excel без «кракозябр».
Як зробити парсер надійнішим
- Перевіряйте, чи елемент знайдено, перш ніж брати з нього текст:
if el:. - Додайте
timeout і повторні спроби при помилках мережі. - Робіть паузи між запитами й не відправляйте їх паралельно сотнями.
- Використовуйте сесію
requests.Session(), щоб зберігати cookie й прискорити роботу.
Коли BeautifulSoup не допоможе
Якщо у відповіді сервера немає потрібних даних, бо вони завантажуються скриптами, потрібен браузер: див. парсинг динамічних сторінок на Python. Для сторінок за логіном — парсинг із авторизацією.
Не хочете витрачати час на код? Розробимо парсер під ваше завдання: замовити парсер на Python, або скористайтеся послугою парсинг сайтів.