Тема 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
🧠 Вывод Архитектора:
- Начинай с BeautifulSoup. Серьезно. Не выпендривайся. Пока ты пишешь логику и отлаживаешь селекторы — удобство важнее скорости.
- Уперся в скорость? Переключайся на
Selectolax. Переписать селекторы займет 10 минут, а прирост скорости получишь колоссальный. - Сложная верстка? Если элемент хрен найдешь (нет классов, только "третий
divпосле пятогоspan") — бериlxmlи пиши XPath. Это спасет твои нервы.