Перейти к содержанию

Тема 5: Парсеры HTML: BeautifulSoup vs lxml vs Selectolax. Когда нужна удобная BS4, а когда скорость lxml?

Итак, ты скачал HTML. Теперь это просто длинная, тупая строка текста на 500 килобайт. Твоя задача — найти в этой куче мусора один маленький бриллиант (цену). Для этого нужен парсер — инструмент, который превращает текст в дерево объектов (DOM), по которому можно ходить.

Выбор парсера — это выбор между комфортом и производительностью.


1. BeautifulSoup4 (BS4) — "Уютный диван"

Это самая популярная библиотека. На ней пишут 99% туториалов.

  • Суть: Это не сам парсер, это обертка. Она может использовать под капотом медленный питоновский html.parser или быстрый lxml.
  • Плюсы:
    • Невероятно удобная: soup.find('div').text. Читается как английский язык.
    • Всеядная: Жрет любой кривой, поломанный, незакрытый HTML. Она сама додумает, где закрыть тег.
  • Минусы:
    • Медленная: Создает кучу питоновских объектов. Жрет память. На объемах 100к+ страниц ты постареешь, пока она закончит.
  • Вердикт: Идеальна для новичков, прототипов и задач "спарсить 100 статей".

2. lxml — "Промышленный станок"

Это стандарт индустрии. Написана на C (libxml2).

  • Суть: Жесткая, быстрая, мощная.
  • Киллер-фича: Поддержка XPath. Это язык запросов к XML/HTML, который в 10 раз мощнее CSS-селекторов. Ты можешь сказать: "Дай мне ссылку, которая находится внутри второго дива, у которого есть сосед с текстом 'Цена'". CSS так не умеет.
  • Плюсы: Очень быстрая.
  • Минусы: API чуть сложнее (деревянное).
  • Вердикт: Выбор профи. Если нужен сложный поиск (вверх-вниз по дереву) — только lxml + XPath.

3. Selectolax — "Болид Формулы-1"

Это современный зверь. Обертка над движком Modest (написан на C, без лишних зависимостей).

  • Суть: Скорость любой ценой.
  • Плюсы:
    • Безумно быстрая: В 10-20 раз быстрее BeautifulSoup. Она почти не нагружает процессор.
    • Легкая: Минимум потребления RAM.
  • Минусы: Поддерживает только CSS-селекторы. Если тебе нужен сложный XPath — увы. Чуть менее удобный API.
  • Вердикт: Если ты парсишь миллион страниц и структура простая — это безальтернативный выбор.

⚔️ ТЕСТ НА СКОРОСТЬ (Benchmark)

Представь, что мы парсим страницу Amazon (200 КБ HTML).

Парсер Время на 1 стр. Нагрузка CPU
BeautifulSoup ~20.0 мс 🔥 Высокая
lxml ~4.0 мс 🟡 Средняя
Selectolax ~0.8 мс 🟢 Почти ноль

Разница между 20мс и 0.8мс кажется смешной? Умножь на 1 000 000 страниц.

  • BS4: 5.5 часов чистого парсинга.
  • Selectolax: 13 минут.

👨‍💻 КОД: Почувствуй синтаксис

Задача: Достать заголовок <h1> с классом title.

BeautifulSoup (Удобно)

from bs4 import BeautifulSoup
soup = BeautifulSoup(html, "lxml")

# Методы pythonic-style
title = soup.find("h1", class_="title").text

lxml (Мощно - XPath)

from lxml import html
tree = html.fromstring(html_content)

# XPath - мощь. "//" - искать везде, "@class" - атрибут
# Возвращает ВСЕГДА список
title = tree.xpath('//h1[@class="title"]/text()')[0]

Selectolax (Быстро)

from selectolax.parser import HTMLParser
tree = HTMLParser(html_content)

# CSS селекторы only. Синтаксис чуть строже.
node = tree.css_first("h1.title")
title = node.text() if node else None

🧠 Вывод Архитектора:

  1. Начинай с BeautifulSoup. Серьезно. Не выпендривайся. Пока ты пишешь логику и отлаживаешь селекторы — удобство важнее скорости.
  2. Уперся в скорость? Переключайся на Selectolax. Переписать селекторы займет 10 минут, а прирост скорости получишь колоссальный.
  3. Сложная верстка? Если элемент хрен найдешь (нет классов, только "третий div после пятого span") — бери lxml и пиши XPath. Это спасет твои нервы.