Якщо ви думаєте, що веб-сторінки — це просто красиві картинки і текст, то у мене для вас новина: вони як цибулини — багатошарові і можуть змусити вас плакати (від радості, звісно!), коли ви дізнаєтеся, скільки даних можна з них витягти. Сьогодні ми покопаємося в HTML-сторінках за допомогою бібліотеки BeautifulSoup. Захопіть свою віртуальну лопату — час копати!
1. Аналіз HTML-документів
Прості сторінки
Давайте розберемо кілька простих HTML-документів, щоб зрозуміти, з чого вони складаються та які елементи можуть бути цікавими для витягу даних.
Приклад сторінки новини:
<html>
<head>
<title>Новини</title>
</head>
<body>
<h1>Головна новина дня</h1>
<p>Сьогодні сталося щось важливе!</p>
</body>
</html>
У цьому прикладі h1 містить заголовок статті, а p — основний текст.
Вплив HTML-структури на скрейпінг
Перш ніж використовувати BeautifulSoup, важливо зрозуміти, як структурований HTML-документ, який ви хочете розпарсити. Це дозволяє визначити, які частини сторінки містять потрібні дані. Наприклад, якщо ви шукаєте заголовок сторінки, зверніть увагу на <h1>, а для витягу списку використовуйте <ul> і <li>.
Підготовка до скрейпінгу
Перед початком витягу даних важливо виділити ключові теги та атрибути. Наприклад, якщо веб-розробники самі розмітили дані на своїй сторінці, наприклад використавши атрибут class="headline" для заголовка, це вам дуже допоможе. Використовуйте засоби розробника в браузері, щоб дослідити HTML-структуру. Для цього натисніть правою кнопкою миші на елементі та виберіть "Inspect" (у Google Chrome).
2. Установка і налаштування бібліотек
Установка BeautifulSoup і requests
Для роботи з HTML ми будемо використовувати бібліотеку BeautifulSoup. Також, щоб завантажувати HTML-сторінки, нам знадобиться requests. Установка проста і вимагає лише кілька команд у вашій консолі:
pip install beautifulsoup4 requests
Спільна робота запитів і BeautifulSoup
Requests дозволить нам надсилати запити до HTML-сторінок, а BeautifulSoup допоможе з їхнім розбором. Подивімося, як це виглядає в дії:
import requests
from bs4 import BeautifulSoup
# Завантажуємо сторінку
url = 'https://example.com'
response = requests.get(url)
# Парсимо сторінку з BeautifulSoup
soup = BeautifulSoup(response.text, 'html.parser')
# Витягуємо заголовок сторінки
title = soup.title.text
print('Заголовок:', title)
3. Навігація і витяг даних за тегами
Методи навігації
Тепер, коли у нас є HTML-документ, ми можемо використовувати BeautifulSoup для навігації по ньому. Шикарний метод .select() дозволяє витягувати дані, використовуючи CSS-селектори.
Витяг даних за тегами
BeautifulSoup надає методи, які дозволяють знаходити елементи за їхніми тегами, такими як find і find_all. Вони допоможуть вам знайти бажані шматочки даних:
# Знаходимо перший абзац
paragraph = soup.find('p').text
print('Перший абзац:', paragraph)
# Знаходимо всі елементи списку
list_items = soup.find_all('li')
for item in list_items:
print('Елемент списку:', item.text)
Використання атрибутів для фільтрації
Іноді вам потрібно буде витягати елементи, які відповідають певним умовам, наприклад, мають певний class. BeautifulSoup дозволяє легко це зробити:
# Витяг елемента з певним класом
headline = soup.find('h1', class_='main-headline').text
print('Заголовок:', headline)
4. Застосування CSS-селекторів
Що таке CSS-селектори?
CSS-селектори — потужний інструмент з точки зору Python-програміста, який дозволяє витягувати дані за конкретними критеріями. Вони можуть бути використані для пошуку елементів, які мають спільні стилі, що робить скрейпінг більш гнучким і точним.
Використання селекторів у BeautifulSoup
BeautifulSoup дозволяє використовувати CSS-селектори через метод select. Наприклад:
# Вибір всіх посилань
links = soup.select('a')
for link in links:
print('Посилання:', link['href'])
Ви навіть можете комбінувати селектори для більш точного вибору. Наприклад, soup.select('div.article h2') вибере всі h2 всередині div з класом article.
Приклади пошуку з CSS-селекторами
Застосуймо наші знання на практиці. Виберіть всі абзаци з класом highlight і виведіть їх текст:
# Витяг всіх абзаців з класом 'highlight'
highlighted_paragraphs = soup.select('p.highlight')
for para in highlighted_paragraphs:
print('Виділений абзац:', para.text)
На цьому поки все, не забудьте попрактикуватися у своїх навичках скрейпінгу до наступної зустрічі. Удачі у захоплюючому світі парсингу!
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ