Написати в Телеграм Написати у Вайбер Зателефонувати

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, або скористайтеся послугою парсинг сайтів.