Python: уроки, справочник и задачи

Библиотека BeautifulSoup: разбор HTML и XML на Python

Раздел: Парсинг на Python · Обновлено 31.10.2026

BeautifulSoup в Python превращает HTML или XML в дерево объектов, по которому удобно искать теги, читать их текст и атрибуты. Ниже разобраны установка пакета bs4, выбор парсера, методы find(), find_all() и select(), а также примеры извлечения ссылок, классов и данных из XML. Для загрузки страниц библиотеку обычно используют вместе с модулем requests.

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

Python Beautifulsoup
Фото: Union Porcelain Works / CC0, Wikimedia Commons
Содержание статьи
  1. Почему выбирают BeautifulSoup?
  2. Как использовать BeautifulSoup для парсинга данных?
  3. Пример использования BeautifulSoup для парсинга
  4. Дополнительные функции BeautifulSoup
  5. Советы по использованию BeautifulSoup
  6. Пример 1: Извлечение ссылок с веб-страницы
  7. Пример 2: Парсинг XML данных
  8. Пример 3: Поиск элементов с определенным классом
  9. Пример 4: Работа с атрибутами элементов
  10. Заключение
  11. Установка bs4 и выбор парсера
  12. CSS-селекторы, текст и навигация по дереву
    1. Поиск через select() и select_one()
    2. Метод get_text() и свойство text
    3. Переходы к соседним и родительским тегам
  13. Частые вопросы
    1. Чем find() отличается от find_all()?
    2. Почему нельзя писать class= при поиске по классу?
    3. Почему BeautifulSoup не видит данные, которые есть в браузере?
    4. Как получить значение атрибута без ошибки?
    5. Можно ли парсить страницы, сохраненные на диск?

На этом блоге есть небольшой практический курс, который раскрывает некоторые возможности Beautifulsoup на практических примерах, советую ознакомиться, так же есть отличная русскоязычная документация по данной библиотеке.

Почему выбирают BeautifulSoup?

BeautifulSoup является одним из наиболее популярных инструментов для парсинга HTML и XML благодаря своей простоте использования, гибкости и мощным функциям. Ниже мы рассмотрим ключевые преимущества BeautifulSoup:

  1. Простота: BeautifulSoup предоставляет простой и интуитивно понятный интерфейс для работы с HTML и XML данными, что делает процесс парсинга удобным даже для новичков.
  2. Гибкость: Благодаря мощным методам поиска и фильтрации элементов, BeautifulSoup позволяет эффективно извлекать нужную информацию из сложных структур HTML и XML.
  3. Поддержка различных типов данных: BeautifulSoup поддерживает работу не только с HTML, но и с XML данными, что делает его универсальным инструментом для парсинга различных форматов.

Как использовать BeautifulSoup для парсинга данных?

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

from bs4 import BeautifulSoup
import requests
# Загрузка веб-страницы
url = 'https://www.example.com'
response = requests.get(url)
soup = BeautifulSoup(response.text, 'html.parser')
# Извлечение текста элемента
element = soup.find('h1')
print(element.text)

Пример использования BeautifulSoup для парсинга

Предположим, у нас есть HTML код следующего вида:

<html>
  <body>
    <h1>Заголовок</h1>
    <p>Текст абзаца.</p>
  </body>
</html>

С использованием BeautifulSoup можно легко извлечь текст заголовка и абзаца:

from bs4 import BeautifulSoup
html = '''
<html>
  <body>
    <h1>Заголовок</h1>
    <p>Текст абзаца.</p>
  </body>
</html>
'''
soup = BeautifulSoup(html, 'html.parser')
title = soup.find('h1').text
paragraph = soup.find('p').text
print(title)  # Выводит: Заголовок
print(paragraph)  # Выводит: Текст абзаца.

Кроме простого поиска по тегу, у BeautifulSoup есть и другие возможности для работы с HTML и XML. Ниже приведены дополнительные аспекты, которые стоит учитывать при использовании библиотеки BeautifulSoup:

Дополнительные функции BeautifulSoup

  1. Методы поиска элементов: BeautifulSoup предоставляет различные методы поиска элементов на веб-странице, такие как find(), find_all(), select(), позволяющие найти нужные элементы по тегу, классу, id и другим атрибутам.
  2. Навигация по дереву DOM: BeautifulSoup предоставляет возможность навигации по дереву DOM структуры HTML или XML данных, что упрощает доступ к различным элементам и их содержимому.
  3. Извлечение текста и атрибутов: с помощью BeautifulSoup можно легко извлекать текст элементов, а также их атрибуты, что делает процесс парсинга более гибким и удобным.
  4. Фильтрация результатов поиска: можно применять фильтры для точного поиска элементов, например, по содержимому, регулярным выражениям или другим критериям.

Советы по использованию BeautifulSoup

Для демонстрации возможностей BeautifulSoup, предоставлю различные примеры использования библиотеки для парсинга HTML и XML данных.

Пример 1: Извлечение ссылок с веб-страницы

Предположим, у нас есть HTML код, содержащий несколько ссылок:

<html>
  <body>
    <a href="https://www.example.com/page1">Ссылка 1</a>
    <a href="https://www.example.com/page2">Ссылка 2</a>
    <a href="https://www.example.com/page3">Ссылка 3</a>
  </body>
</html>

Мы можем использовать BeautifulSoup для извлечения всех ссылок из этого HTML:

from bs4 import BeautifulSoup
html = '''
<html>
  <body>
    <a href="https://www.example.com/page1">Ссылка 1</a>
    <a href="https://www.example.com/page2">Ссылка 2</a>
    <a href="https://www.example.com/page3">Ссылка 3</a>
  </body>
</html>
'''
soup = BeautifulSoup(html, 'html.parser')
links = soup.find_all('a')
for link in links:
    print(link.get('href'))

Этот код выведет все ссылки, содержащиеся в HTML.

Пример 2: Парсинг XML данных

BeautifulSoup также поддерживает парсинг XML данных. Рассмотрим пример XML файла:

<data>
    <item>Товар 1</item>
    <item>Товар 2</item>
    <item>Товар 3</item>
</data>

Используя BeautifulSoup, мы можем извлечь содержимое тегов item из этого XML файла:

from bs4 import BeautifulSoup
xml = '''
<data>
    <item>Товар 1</item>
    <item>Товар 2</item>
    <item>Товар 3</item>
</data>
'''
soup = BeautifulSoup(xml, 'xml')
items = soup.find_all('item')
for item in items:
    print(item.text)

Этот код извлечет содержимое тегов item из XML.

Пример 3: Поиск элементов с определенным классом

Предположим, у нас есть HTML код с несколькими элементами, имеющими одинаковый класс:

<html>
  <body>
    <div class="article">
      <h1>Заголовок статьи 1</h1>
      <p>Текст статьи 1</p>
    </div>
    <div class="article">
      <h1>Заголовок статьи 2</h1>
      <p>Текст статьи 2</p>
    </div>
  </body>
</html>

Мы можем использовать BeautifulSoup для поиска всех элементов с классом "article" и извлечения содержимого:

from bs4 import BeautifulSoup
html = '''
<html>
  <body>
    <div class="article">
      <h1>Заголовок статьи 1</h1>
      <p>Текст статьи 1</p>
    </div>
    <div class="article">
      <h1>Заголовок статьи 2</h1>
      <p>Текст статьи 2</p>
    </div>
  </body>
</html>
'''
soup = BeautifulSoup(html, 'html.parser')
articles = soup.find_all('div', class_='article')
for article in articles:
    title = article.find('h1').text
    content = article.find('p').text
    print(title, content)

Этот код извлечет заголовки и содержимое статей с классом "article" из HTML.

Пример 4: Работа с атрибутами элементов

Пусть у нас будет HTML код с изображением и ссылкой:

<html>
  <body>
    <img src="image.jpg" alt="Изображение">
    <a href="https://www.example.com">Ссылка</a>
  </body>
</html>

С помощью BeautifulSoup мы можем получить значения атрибутов элементов (например, src у изображения или href у ссылки):

from bs4 import BeautifulSoup
html = '''
<html>
  <body>
    <img src="image.jpg" alt="Изображение">
    <a href="https://www.example.com">Ссылка</a>
  </body>
</html>
'''
soup = BeautifulSoup(html, 'html.parser')
img_src = soup.find('img')['src']
link_href = soup.find('a')['href']
print(img_src)  # Выводит: image.jpg
print(link_href)  # Выводит: https://www.example.com

Этот код извлечет значения атрибутов src и href из HTML.

Заключение

Приведенные примеры показывают основные приемы работы BeautifulSoup при работе с HTML и XML данными. Библиотека предоставляет множество инструментов для извлечения и обработки информации из веб-страниц и файлов.

Пробуйте различные методы и функции BeautifulSoup для работы с элементами HTML и XML, чтобы сделать процесс парсинга более эффективным и удобным!

Установка bs4 и выбор парсера

Пакет на PyPI называется beautifulsoup4, а импортируется как bs4. Старый пакет BeautifulSoup без цифры относится к третьей версии и с Python 3 не работает. Ставить библиотеку лучше в виртуальное окружение проекта.

pip install beautifulsoup4 lxml

Вторым аргументом конструктора BeautifulSoup(markup, parser) передается имя парсера. От него зависят скорость и то, как будет исправлена битая разметка.

ПарсерКак подключитьОсобенности
html.parserВстроен в PythonНе требует установки, скорость средняя
lxmlpip install lxmlСамый быстрый, подходит для больших страниц
xml (через lxml)pip install lxmlЕдинственный вариант для разбора XML
html5libpip install html5libРазбирает разметку как браузер, но медленный

Если парсер не указать, библиотека выберет лучший из установленных и выведет предупреждение. Явное указание делает результат одинаковым на всех компьютерах.

CSS-селекторы, текст и навигация по дереву

Кроме find() и find_all() у объекта есть методы select() и select_one(). Они принимают CSS-селектор, как в браузере, и удобны для вложенных условий.

Поиск через select() и select_one()

Метод select() всегда возвращает список, select_one() возвращает первый элемент или None.

from bs4 import BeautifulSoup

html = '''
<ul class="menu">
  <li><a href="/news/">Новости</a></li>
  <li class="active"><a href="/blog/"> Блог </a></li>
</ul>
'''
soup = BeautifulSoup(html, "html.parser")

for a in soup.select("ul.menu a[href]"):
    print(a["href"])          # /news/  затем  /blog/

active = soup.select_one("li.active a")
print(active.get_text(strip=True))  # Блог

Метод get_text() и свойство text

Свойство .text склеивает весь текст внутри тега вместе с пробелами и переносами строк. Метод get_text(separator, strip=True) обрезает пробелы у каждого куска и соединяет куски заданным разделителем, это удобно для ячеек таблиц и карточек товаров.

Переходы к соседним и родительским тегам

Найденный тег знает свое место в дереве: .parent возвращает родителя, .find_next_sibling() следующий тег того же уровня, .find_parent("div") ближайшего предка с нужным именем. Так можно найти подпись, а потом взять значение из соседней ячейки.

from bs4 import BeautifulSoup

html = "<table><tr><td>Цена</td><td>1500</td></tr></table>"
soup = BeautifulSoup(html, "html.parser")

label = soup.find("td", string="Цена")
print(label.find_next_sibling("td").text)  # 1500
print(label.find_parent("tr").name)         # tr

Если тега может не оказаться на странице, проверяйте результат перед обращением к .text: find() вернет None, и вызов атрибута завершится ошибкой AttributeError.

Частые вопросы

Короткие ответы на вопросы, с которыми сталкиваются при первом знакомстве с bs4.

Чем find() отличается от find_all()?

find() возвращает первый подходящий тег или None, если ничего не найдено. find_all() возвращает список всех совпадений, пустой список при отсутствии результата. Параметр limit у find_all() ограничивает число найденных элементов.

Почему нельзя писать class= при поиске по классу?

Слово class зарезервировано в Python, поэтому в BeautifulSoup используют аргумент class_: soup.find_all("div", class_="article"). Другой вариант: attrs={"class": "article"} или селектор div.article.

Почему BeautifulSoup не видит данные, которые есть в браузере?

Библиотека разбирает только тот HTML, который вернул сервер, JavaScript она не выполняет. Если содержимое подгружается скриптом, найдите в инструментах разработчика запрос к API и получайте JSON напрямую, либо используйте браузерную автоматизацию.

Как получить значение атрибута без ошибки?

Запись tag["href"] выбросит KeyError, если атрибута нет. Метод tag.get("href") в этом случае вернет None, а tag.get("href", "") вернет значение по умолчанию.

Можно ли парсить страницы, сохраненные на диск?

Да, передайте в конструктор открытый файл или прочитанную строку: BeautifulSoup(open("page.html", encoding="utf-8"), "html.parser"). Подробнее о файлах в статье про чтение и запись файлов.