Открыть сервис

Beautiful Soup

Beautiful Soup — это библиотека языка программирования Python для извлечения данных из файлов HTML и XML. Она предоставляет инструменты для навигации, поиска и модификации дерева разбора документа, что позволяет автоматизировать процесс парсинга (синтаксического анализа) веб-страниц. Библиотека широко применяется в веб-скрапинге (data scraping) — сборе информации с веб-сайтов.

История и создание

Библиотека Beautiful Soup была создана американским программистом Леонардом Ричардсоном (Leonard Richardson). Первая версия, выпущенная в 2004 году, была написана на языке Python и предназначалась для упрощения работы с некорректно оформленным HTML-кодом, который часто встречается в реальном веб-пространстве. Название библиотеки отсылает к одноимённому стихотворению из книги «Алиса в Стране чудес» Льюиса Кэрролла.

В 2012 году вышла версия Beautiful Soup 4 (BS4), которая стала основной и поддерживается до настоящего времени. Она была переписана с нуля, получила поддержку Python 3 и стала более модульной. Разработка ведётся как сообществом, так и компанией Crummy, с которой сотрудничает Ричардсон. По состоянию на 2024 год актуальной стабильной версией является Beautiful Soup 4.12.2.

Архитектура и принцип работы

Beautiful Soup не является самостоятельным парсером. Она выступает в роли обёртки (wrapper) над внешними парсерами HTML/XML, предоставляя единый, удобный интерфейс для работы с ними. Основная задача библиотеки — преобразовать сырой HTML- или XML-документ в объектно-ориентированную модель данных, с которой можно взаимодействовать программно.

Парсеры

Для работы Beautiful Soup использует один из следующих парсеров:

  • html.parser — встроенный парсер из стандартной библиотеки Python. Не требует установки дополнительных пакетов, но может медленно работать и плохо справляться с сильно «сломанным» HTML.
  • lxml — быстрый и мощный парсер, написанный на C. Поддерживает как HTML, так и XML. Требует установки пакета lxml. Рекомендуется для большинства задач.
  • html5lib — парсер, реализующий алгоритм разбора HTML5. Он наиболее устойчив к ошибкам в разметке и воспроизводит поведение современных браузеров, но является самым медленным. Требует установки пакета html5lib.

Объектная модель

После разбора документа Beautiful Soup создаёт иерархическую структуру, представленную четырьмя основными типами объектов:

  1. Tagобъект, представляющий элемент HTML/XML (например, <div>, <a>, <p>). Он обладает атрибутами (доступ к которым осуществляется через словарь tag.attrs) и может содержать другие теги или строки текста.
  2. NavigableString — объект, представляющий текстовое содержимое внутри тега (например, текст ссылки).
  3. BeautifulSoup — корневой объект, представляющий весь документ. Фактически, это специальный объект типа Tag, соответствующий всему документу.
  4. Comment — подкласс NavigableString, представляющий комментарии в HTML.

Функциональность

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

Beautiful Soup позволяет перемещаться по дереву разбора как вниз, так и вверх и в стороны. Основные методы и атрибуты для навигации:

  • tag.contents — возвращает список прямых потомков тега.
  • tag.children — возвращает итератор по прямым потомкам.
  • tag.descendants — возвращает итератор по всем потомкам (рекурсивно).
  • tag.parent — возвращает родительский тег.
  • tag.parents — возвращает итератор по всем предкам.
  • tag.next_sibling и tag.previous_sibling — возвращают следующий и предыдущий «соседний» элемент на том же уровне вложенности.
  • tag.next_element и tag.previous_element — возвращают следующий и предыдущий элемент в порядке обхода дерева (независимо от уровня вложенности).

Поиск в дереве

Основной метод для поиска элементов — find_all() (и его сокращённый вариант ()). Он принимает множество аргументов для фильтрации:

  • Имя тега: soup.find_all('a') — найдёт все ссылки.
  • Строковое содержимое: soup.find_all(text='Пример') — найдёт все строки с точным совпадением.
  • Регулярные выражения: soup.find_all(href=re.compile('example\.com')) — найдёт все ссылки, содержащие example.com.
  • Список: soup.find_all(['h1', 'h2']) — найдёт все заголовки первого и второго уровня.
  • Функция: можно передать пользовательскую функцию, которая возвращает True для нужных элементов.
  • Атрибуты: soup.find_all('div', class_='content') — найдёт все div с классом content. Обратите внимание на подчёркивание в class_, так как class является зарезервированным словом в Python.
  • CSS-селекторы: метод soup.select() принимает CSS-селектор и возвращает список совпавших элементов (например, soup.select('div.content > p')).

Другие полезные методы поиска: find() (возвращает первый найденный элемент), find_parent(), find_next_sibling(), find_all_next() и т.д.

Модификация документа

Beautiful Soup позволяет не только читать, но и изменять HTML/XML-документ:

  • Изменение строк: tag.string.replace_with('Новый текст').
  • Изменение атрибутов: tag['class'] = 'new-class'.
  • Добавление и удаление тегов: tag.append(new_tag), tag.decompose() (удаляет тег и его содержимое).
  • Создание новых тегов: soup.new_tag('a', href='...').

Применение

Beautiful Soup является одним из основных инструментов для веб-скрапинга на Python. Она используется в различных сферах:

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

Ограничения и альтернативы

Несмотря на свою популярность, Beautiful Soup имеет ряд ограничений:

  • Скорость: она медленнее, чем низкоуровневые парсеры, такие как lxml.html или html.parser, особенно при работе с очень большими документами.
  • Не выполняет JavaScript: Beautiful Soup работает только с полученным HTML-кодом. Она не может взаимодействовать с динамическим контентом, который загружается или изменяется скриптами на стороне клиента. Для таких задач её комбинируют с библиотеками, управляющими браузером, например, Selenium или Playwright.
  • Сложность с сильно вложенными структурами: при работе с очень сложными и глубоко вложенными документами код на Beautiful Soup может стать громоздким.

Основными альтернативами Beautiful Soup являются:

  • lxml: более быстрый и гибкий парсер, который может использоваться как самостоятельно, так и в качестве движка для Beautiful Soup.
  • Requests-HTML: библиотека, объединяющая HTTP-запросы и парсинг, с поддержкой JavaScript.
  • Scrapy: полноценный фреймворк для веб-скрапинга, включающий в себя парсер, асинхронный движок, систему конвейеров и многое другое. Он более сложен в освоении, но значительно мощнее для крупных проектов.

Интересные факты

  • Название «Beautiful Soup» (Красивый суп) является отсылкой к стихотворению о «Красивом супе» из книги «Алиса в Стране чудес», которое пародирует английскую поэзию.
  • Библиотека изначально создавалась для исправления «некрасивого» (плохо оформленного) HTML, превращая его в «красивый» (структурированный) объект.
  • Beautiful Soup автоматически обрабатывает кодировки символов, что является частой проблемой при парсинге сайтов на разных языках.

Источники

  • Richardson, L. (2023). Beautiful Soup Documentation. Crummy.
  • Sweigart, A. (2015). Automate the Boring Stuff with Python. No Starch Press.
  • Mitchell, R. (2018). Web Scraping with Python: Collecting More Data from the Modern Web. O'Reilly Media.
  • Официальная документация Beautiful Soup 4.

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →