BeautifulSoup – парсинг HTML

онлайн тренер по питону
Онлайн-тренажер Python 3 для начинающих

Теория без воды. Задачи с автоматической проверкой. Подсказки на русском языке. Работает в любом современном браузере.

начать бесплатно

Введение в BeautifulSoup

BeautifulSoup — это популярная библиотека Python для парсинга HTML и XML-документов. Она обеспечивает простой интерфейс для навигации, поиска и модификации дерева HTML. BeautifulSoup широко используется для извлечения информации с веб-страниц, включая ссылки, таблицы, изображения, заголовки и другие структурированные данные.


Преимущества и возможности библиотеки

  • Простая навигация по HTML-структуре

  • Поддержка разных парсеров: html.parser, lxml, html5lib

  • Интеграция с requests, urllib, selenium

  • Возможность обработки "грязного" HTML

  • Работа с регулярными выражениями

  • Извлечение, фильтрация, редактирование HTML-элементов


Установка и базовая настройка

Установка библиотеки:

bash
pip install beautifulsoup4

Для использования быстрого парсера lxml:

bash
pip install lxml

Импорт:

python
from bs4 import BeautifulSoup

Загрузка HTML-документа

Пример загрузки HTML с помощью requests:

python
import requests from bs4 import BeautifulSoup url = 'https://example.com' response = requests.get(url) soup = BeautifulSoup(response.text, 'html.parser')

Использование парсеров: lxml, html.parser, html5lib

Поддерживаемые парсеры:

  • 'html.parser' — встроенный в Python

  • 'lxml' — быстрый и надёжный

  • 'html5lib' — совместимый с HTML5-браузерами

python
soup = BeautifulSoup(html, 'lxml')

Навигация по дереву тегов

python
print(soup.title) print(soup.title.name) print(soup.title.string) print(soup.body) print(soup.p)

Навигация по структуре:

python
soup.body.div.h1.text

Поиск по тегам и атрибутам

python
soup.find('a') # первый тег <a> soup.find_all('a') # все теги <a> soup.find_all('div', class_='container') soup.find_all('img', {'src': True})

Использование методов find(), find_all()

find() — возвращает первый найденный элемент.
find_all() — возвращает список всех совпадающих элементов.

python
links = soup.find_all('a') for link in links: print(link.get('href'))

Поиск с использованием регулярных выражений

python
import re soup.find_all('a', href=re.compile(r'^https://'))

Это удобно для фильтрации ссылок, классов, текстовых совпадений и других шаблонов.


Извлечение текста, ссылок и изображений

python
# Текст print(soup.get_text()) # Ссылки for link in soup.find_all('a'): print(link.get('href')) # Изображения for img in soup.find_all('img'): print(img['src'])

Модификация и очистка HTML

Удаление всех скриптов:

python
for script in soup(['script', 'style']): script.decompose()

Изменение текста:

python
tag = soup.find('h1') tag.string = "Новый заголовок"

Примеры парсинга реальных страниц

Извлечение заголовков новостей:

python
response = requests.get("https://news.ycombinator.com/") soup = BeautifulSoup(response.text, 'html.parser') titles = soup.find_all('a', class_='titlelink') for title in titles: print(title.text)

Объединение с requests и Selenium

С requests:

python
soup = BeautifulSoup(requests.get(url).text, 'html.parser')

С selenium (динамические страницы):

python
from selenium import webdriver driver = webdriver.Chrome() driver.get(url) html = driver.page_source soup = BeautifulSoup(html, 'html.parser')

Работа с таблицами и структурированными данными

python
table = soup.find('table') rows = table.find_all('tr') for row in rows: cols = row.find_all('td') data = [col.text.strip() for col in cols] print(data)

Часто задаваемые вопросы

Что такое BeautifulSoup?

Это библиотека для парсинга HTML и XML-документов в Python.

Поддерживает ли BeautifulSoup JavaScript?

Нет, для JavaScript-контента используется Selenium или Playwright.

Какой парсер лучше использовать?

lxml — быстрый и стабильный, html5lib — наиболее совместимый с браузерами.

Можно ли сохранять изменения HTML?

Да, через soup.prettify() и str(soup).

Подходит ли BeautifulSoup для больших данных?

Для больших объёмов данных лучше использовать Scrapy или lxml напрямую.

Полный справочник по ключевым функциям и модулям библиотеки BeautifulSoup для Python

Создание объекта парсера

Функция / Класс Описание
BeautifulSoup(markup, parser) Создает объект парсера из HTML/XML-строки.
parser='html.parser' Встроенный Python-парсер (медленный, но без зависимостей).
parser='lxml' Быстрый и гибкий парсер (требует установки lxml).
parser='html5lib' Эмуляция браузерного разбора (медленный, но максимально точный).
python
from bs4 import BeautifulSoup soup = BeautifulSoup(html, 'html.parser')

Поиск элементов (основные методы)

Метод Описание
soup.find(tag, attrs) Находит первый элемент по тегу и атрибутам.
soup.find_all(tag, attrs) Находит все элементы по тегу и атрибутам.
soup(tag) Альтернатива find_all() — вызов объекта как функции.
soup.select('css_selector') Поиск элементов по CSS-селекторам.
soup.select_one('selector') Поиск первого элемента по CSS-селектору.

Атрибуты и содержимое

Свойство / Метод Описание
element.name Имя тега (например, "div").
element.attrs Все атрибуты в виде словаря.
element['href'] Значение конкретного атрибута.
element.get('href') Безопасный доступ к атрибуту.
element.text / element.get_text() Извлекает текстовое содержимое.
element.string Возвращает строку, если она единственная.

Навигация по дереву

Свойство / Метод Описание
element.contents Список прямых потомков.
element.children Итератор по детям.
element.descendants Итератор по всем вложенным элементам.
element.parent Родительский элемент.
element.parents Итератор по всем родителям.
element.next_sibling / previous_sibling Соседние элементы.
element.next_elements / previous_elements Все следующие / предыдущие узлы.

Фильтрация и параметры поиска

Параметр Описание
name="div" По имени тега.
attrs={"class": "header"} По атрибутам.
class_="name" По классу (class — зарезервированное слово в Python).
id="main" По идентификатору.
text="пример" По точному совпадению текста.
text=re.compile("шаблон") По регулярному выражению.
python
soup.find("a", class_="nav")

Изменение и генерация HTML

Метод / Свойство Описание
element['href'] = 'новый_адрес' Изменение атрибута.
element.string = 'новый_текст' Замена содержимого.
element.append(new_tag) Добавление потомка.
element.insert(position, new_tag) Вставка по позиции.
element.decompose() Полное удаление тега.
element.extract() Удаление и возврат элемента.
str(soup) / soup.prettify() Генерация HTML-строки.

Создание новых элементов

Метод Описание
soup.new_tag("tagname") Создает новый HTML-тег.
soup.new_string("text") Создает новый текстовый узел.
python
new_tag = soup.new_tag("a", href="https://example.com") new_tag.string = "Перейти"

Парсинг XML

Отличие Описание
Используется парсер 'xml' Более строгая проверка структуры.
Поддержка пространства имён Необходима при работе с XML-атрибутами.
python
soup = BeautifulSoup(xml_string, 'xml')

Совместимость с requests

Комбинация Пример
Загрузка HTML-страницы и парсинг  
python
import requests from bs4 import BeautifulSoup resp = requests.get("https://example.com") soup = BeautifulSoup(resp.text, "html.parser")

Утилиты

Функция Описание
Comment Для поиска HTML-комментариев.
NavigableString Строка, вложенная в HTML-тег.
soup.find_all(string=...) Поиск текста в документе.

Заключение: BeautifulSoup как инструмент для парсинга HTML

BeautifulSoup — это мощный и гибкий инструмент для извлечения информации из HTML и XML. Его простота, поддержка различных парсеров и широкие возможности навигации делают его идеальным решением для парсинга веб-страниц, анализа контента и автоматизации сбора данных. В связке с requests и Selenium он позволяет решать как простые, так и сложные задачи веб-скрапинга.