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

Каковы альтернативы BeautifulSoup для анализа HTML в Python?

Как разработчик Python, вы, вероятно, знакомы с BeautifulSoup (также известным как BS4) — почтенной библиотекой синтаксического анализа HTML/XML, которая уже более десяти лет является основным продуктом парсинга веб-страниц Python.

Но вы, возможно, не знаете, что Beautiful Soup — далеко не единственный вариант парсинга HTML в Python в наши дни. Фактически, существует удивительное количество эффективных альтернатив BeautifulSoup, которые в некоторых случаях даже превосходят BS4 по функциональности и производительности.

В этом подробном руководстве мы рассмотрим некоторые из самых популярных и мощных альтернатив BeautifulSoup для очистки и анализа HTML с помощью Python.

Зачем рассматривать альтернативы BeautifulSoup?

Прежде чем углубляться в варианты, вы можете задаться вопросом: зачем вообще рассматривать альтернативы?

Вот несколько причин, по которым вы можете захотеть выйти за рамки BeautifulSoup для своих проектов по очистке веб-страниц Python:

  • Более высокая производительность – Некоторые новые парсеры значительно превосходят BS4 в тестах. Скорость имеет решающее значение при парсинге больших сайтов.

  • Дополнительные функции – Такие библиотеки, как lxml, предоставляют дополнительные возможности, такие как поддержка XPath.

  • Улучшенный парсинг HTML5 – BeautifulSoup иногда может бороться с некорректным и современным HTML.

  • Более простые API – Такие библиотеки, как Parsel, предлагают более интуитивно понятные API-интерфейсы Pythonic.

  • Многопоточность – Некоторые альтернативные анализаторы позволяют выполнять многопоточный анализ, используя преимущества нескольких ядер ЦП.

  • Соответствие стандартам – Вам может понадобиться парсер, который строго соответствует спецификации HTML.

  • Более легкая установка – BS4 имеет некоторые зависимости C, которые могут вызвать проблемы при установке, особенно в системах с ограниченным доступом, таких как AWS Lambda. Альтернативы с чистым кодом Python можно развернуть проще.

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

lxml – быстро как молния

Одна из самых популярных и мощных альтернатив BeautifulSoup — lxml. Библиотека lxml предоставляет чрезвычайно быстрый и многофункциональный API для анализа HTML и XML с помощью Python.

В тестах lxml постоянно превосходит BeautifulSoup со значительным отрывом. Это не редкость увидеть Улучшение скорости в 10-100 раз при использовании lxml для анализа HTML вместо BeautifulSoup.

Это делает lxml незаменимым инструментом для тех, кто парсит большие сайты или анализирует огромные HTML-документы. Преимущества в скорости позволяют анализировать разметку гораздо эффективнее и снижать затраты на многопоточное парсинг.

Некоторые ключевые преимущества lxml:

  • Невероятная скорость анализа XML и HTML
  • Поддержка очень больших документов
  • Поддержка XPath 1.0 для сложных запросов.
  • Поддержка селектора CSS, аналогичная BeautifulSoup.
  • Упрощенная обработка потоков — lxml освобождает GIL, что позволяет выполнять многопоточный анализ.
  • Поддержка парсинга HTML5

Давайте рассмотрим небольшой пример, чтобы увидеть lxml в действии:

from lxml import html
import requests

page = requests.get(‘https://en.wikipedia.org/wiki/Web_scraping‘)
tree = html.fromstring(page.content)

# Get headlines 
headings = tree.xpath(‘//h1/text()|//h2/text()|//h3/text()|//h4/text()|//h5/text()|//h6/text()‘)

print(headings)

Этот простой пример демонстрирует скорость lxml — он может анализировать и запрашивать полную страницу Википедии за миллисекунды!

Некоторые недостатки lxml, которые следует учитывать:

  • Более сложная кривая обучения, чем BeautifulSoup. Запросы XPath требуют более крутого обучения, чем селекторы CSS.
  • Нет встроенного определения кодировки, такого как BS4.
  • Нет Pythonic объектного представления элементов, таких как BS4. Манипулирование осуществляется через API-интерфейсы навигации DOM.

Тем не менее, для большинства рабочих веб-скрапингов lxml является важной частью вашего набора инструментов. Увеличение скорости позволяет вам собирать гораздо больше данных и гораздо эффективнее.

parsel – lxml, упрощенный

Если вам нравится то, что предлагает lxml, но API кажется вам слишком сложным, посмотрите посылка.

Parsel предоставляет более простой в использовании, более Pythonic API, обертывая lxml и предоставляя интерфейс на основе селектора для извлечения данных из HTML/XML.

Ключевым преимуществом парсела является простота и читабельность. Parsel был разработан с нуля с учетом веб-скрапинга, а lxml поддерживает гораздо более широкий спектр функций синтаксического анализа XML.

По сравнению с lxml, parsel предлагает:

  • Упрощенные выражения селектора CSS
  • Автоматическая обработка кодирования
  • Гораздо более простые API-интерфейсы извлечения атрибутов и текста.
  • Более интуитивный подход в целом

Например, вот как извлечь текст и атрибуты с помощью селекторов синтаксиса:

from parsel import Selector

html = ‘‘‘<div>
             <p class="summary">Some text <a href="/ru/more">More</a></p>
           </div>‘‘‘

sel = Selector(text=html)

print(sel.css(‘p::text‘).get()) # Some text More 

print(sel.css(‘a::attr(href)‘).get()) # /more

API Selector будет хорошо знаком всем, кто работал с BeautifulSoup или jQuery. Но вы получаете все преимущества lxml в производительности!

В целом Parsel — отличный выбор, если вам нужен простой и интуитивно понятный интерфейс парсинга, но вы не хотите жертвовать скоростью или преимуществами совместимости lxml.

html5lib — анализ, соответствующий стандартам

Одна из самых крутых альтернатив BeautifulSoup — html5lib.

html5lib уникален, поскольку он анализирует HTML точно так же, как это делает современный веб-браузер. Он строго соответствует спецификации HTML и выводит объектную модель документа, которая точно соответствует официальной спецификации W3C DOM.

Преимущества html5lib включают в себя:

  • Точный и совместимый анализ HTML в соответствии с правилами браузера HTML5.
  • Изящная обработка реальной некорректной разметки.
  • Простая установка, поскольку она реализована исключительно на Python.
  • В большинстве случаев может выступать в качестве замены BS4.
  • Легко настраиваемый и расширяемый

Давайте посмотрим на базовое использование html5lib:

import html5lib

html = ‘<div><span>Example</span></div>‘

parser = html5lib.HTMLParser()
dom = parser.parse(html)

print(dom.getElementsByTagName(‘span‘)[0].toxml())  
# <span>Example</span>

Мы видим, что html5lib создает стандартный объект DOM из документа.

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

Альтернативные HTML-парсеры Python

Хотя lxml, parsel и html5lib являются одними из наиболее эффективных альтернатив BeautifulSoup, есть еще несколько вариантов:

  • PyQuery – Манипулирование DOM в стиле jQuery.
  • КрасиваяСуп4 – OG BeautifulSoup. Медленный, но очень доступный API.
  • HTMLПарсер – Встроенный анализатор HTML Python.
  • htmlмин – Для минимизации HTML.
  • MarkupSafe – Реализует анализатор HTML/XML, представляющий разметку как объекты Python.

Эти библиотеки удовлетворяют различные потребности синтаксического анализа. PyQuery, например, обеспечивает манипулирование DOM в стиле jQuery. BeautifulSoup4 остается популярным благодаря простому API.

Существуют также привязки Python для быстрых анализаторов HTML, например Гусь и jfast которые используют другие базовые высокоскоростные механизмы синтаксического анализа.

Хотя это и не является прямой заменой, для основных задач синтаксического анализа также может подойти встроенный в Python HTMLParser.

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

Как парсеры сравниваются в тестах

Чтобы продемонстрировать разницу в производительности, давайте протестируем некоторые распространенные операции, используя BeautifulSoup, lxml, html5lib и Python HTMLParser.

Я создал простой тестовый сценарий то раз различные парсеры по 3 задачам:

  1. Анализ HTML-страницы Википедии размером ~3 КБ
  2. Находим все ссылки
  3. Поиск конкретных элементов

И вот результаты на моем ноутбуке:

синтаксический анализаторВремя анализаНайти все ссылкиНайти элемент
lxml3.5ms9ms0.1ms
html5lib33ms64ms7ms
КрасивыйСуп12ms18ms1ms
HTMLПарсер4ms32ms0.5ms

Как и ожидалось, lxml чрезвычайно быстр — в некоторых операциях в 10 раз быстрее, чем html5lib. Удивительно, но HTMLParser справляется с базовым анализом, но начинает отставать при запросе элементов.

Эти ориентиры в небольшом документе подчеркивают различия. В больших HTML-документах, где скорость lxml действительно великолепна, разрывы будут еще больше.

Реальные примеры

Давайте теперь рассмотрим несколько реальных примеров использования этих альтернативных парсеров для задач веб-скрапинга:

Парсинг списков продуктов с помощью lxml

Здесь мы возьмем несколько списков продуктов с сайта электронной торговли. Lxml позволяет быстро извлечь любые необходимые нам данные:

from lxml import html
import requests

page = requests.get(‘https://myshop.com/products‘)
doc = html.fromstring(page.content)

# Extract product listings
products = doc.xpath(‘//div[@class="product"]‘) 

for product in products:
   name = product.xpath(‘.//h2[@class="name"]/text()‘)[0]
   price = product.xpath(‘.//span[@class="price"]/text()‘)[0]

   print(name, price)   

С помощью lxml мы можем быстро анализировать даже большие HTML-документы и использовать краткие запросы XPath для извлечения любых необходимых нам данных.

Очистка таблиц с помощью pandas и html5lib

Допустим, нам нужно очистить HTML-таблицы в DataFrame pandas. Html5lib надежно анализирует таблицы:

import html5lib
import pandas as pd

html = ‘‘‘<table>
  <tr>
    <th>Name</th>
    <th>Age</th> 
   </tr>
   <tr>
     <td>John</td>
     <td>30</td>  
   </tr>
   <tr>
     <td>Jane</td>
     <td>32</td>  
   </tr>
</table>‘‘‘

parser = html5lib.HTMLParser()
dom = parser.parse(html)

rows = []
for tr in dom.getElementsByTagName(‘tr‘):
  rows.append([td.text for td in tr.getElementsByTagName(‘td‘)])

df = pd.DataFrame(rows[1:], columns=rows[0])
print(df)  
#    Name  Age
# 0  John   30   
# 1  Jane   32

Соблюдение стандартов Html5lib гарантирует стабильную работу очистки таблиц даже при проблемной разметке.

Очистка текста с помощью Parsel

Для страниц с большим количеством текста parsel упрощает извлечение:

from parsel import Selector 

html = ‘‘‘<div>
            <p>Paragraph 1</p>
            <p>Paragraph 2</p>
         </div>‘‘‘

sel = Selector(text=html)  
content = sel.xpath(‘//div//text()‘).getall()
print(content)

# [‘Paragraph 1‘, ‘Paragraph 2‘]

Parsel дает нам простоту BeautifulSoup в сочетании со скоростью lxml!

Критерии выбора библиотеки парсинга HTML

Какие критерии являются наиболее важными для вашего проекта при оценке всех этих альтернатив BeautifulSoup?

  • Скорость – Если производительность имеет решающее значение, lxml трудно превзойти.

  • правильность — Для надежного парсинга проблемных страниц отлично подходит html5lib.

  • Набор функций – Lxml обеспечивает более полную навигацию по DOM и поддержку XPath.

  • Знакомый API – CSS-селекторы BeautifulSoup проще всего изучить.

  • Обработка некорректной разметки – Lxml и html5lib более надежно обрабатывают реальный HTML.

  • Соответствие стандартам – Html5lib самым строгим образом соответствует поведению браузера HTML5.

  • Простота в использовании – Parsel и PyQuery предлагают простейшие API для парсинга.

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

Часто лучше всего использовать комбинацию библиотек — например, html5lib для анализа и lxml для запроса. Протестируйте различные варианты на примерах страниц, чтобы понять, какие из них хорошо и надежно работают для ваших конкретных потребностей в веб-скрапинге.

Отказ от парсеров при парсинге веб-страниц

Здесь мы сосредоточились на библиотеках синтаксического анализа HTML. Но стоит отметить, что существуют альтернативы подходу синтаксического анализа.

Можно очистить данные без парсера HTML, используя:

  • Обычные выражения – Regex можно использовать для сопоставления необработанного HTML-кода с образцом и извлечения данных. Хрупкий, но иногда работоспособный в простых случаях.
  • Струнные операции – Используйте строковые методы Python для поиска, разделения и фрагментирования строк HTML.
  • HTTP-запросы – Отправляйте запросы непосредственно к API и собирайте ответы API.
  • Автоматизация браузера – Используйте такие инструменты, как Selenium, для очистки визуализированного содержимого JavaScript.
  • Преобразование в такие форматы, как JSON/XML. – Очищайте потоки структурированных данных вместо HTML.

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

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

Основные выводы

Хотя Beautiful Soup решает многие распространенные задачи синтаксического анализа HTML, вашего внимания заслуживают такие альтернативы, как lxml, parsel и html5lib:

  • Lxml – Золотой стандарт скорости и производительности. Идеально подходит для парсинга веб-страниц в промышленных масштабах.

  • посылка – Простой API для удобного парсинга. Опирается на скорость lxml.

  • html5lib – Анализ, совместимый с браузером, для обеспечения точности и соответствия стандартам.

  • тесты – Lxml в некоторых операциях работает до 100 раз быстрее, чем html5lib.

  • Критерии – Скорость против читабельности против правильности. Оцените компромиссы для вашего варианта использования.

  • Нет парсера – В простых случаях могут работать регулярные/строковые операции.

Не ограничивайте себя только BeautifulSoup — экосистема Python предлагает удивительное разнообразие возможностей синтаксического анализа HTML. Воспользуйтесь подходящим инструментом для каждой работы!

Присоединяйтесь к беседе

Ваш электронный адрес не будет опубликован. Обязательные поля помечены * *