Python является популярным выбором для Веб-скрейпинга благодаря количеству доступных HTML-парсеров. В этой статье вы познакомитесь с наиболее широко используемыми парсерами:Beautiful Soup,HTMLParser,lxml,PyQuery иScrapy. Эти парсеры пользуются популярностью благодаря простоте использования, скорости, поддержке современных стандартов HTML, документации и поддержке сообщества.
Приступим!
Beautiful Soup
Beautiful Soup — это библиотека Python для анализа HTML- и XML-документов. Она создает дерево анализа, которое отражает структуру каждой страницы, что упрощает автоматическое извлечение данных. Это дерево представляет иерархию элементов в документе, позволяя вам эффективно перемещаться по нему и выполнять поиск, чтобы найти определенные узлы.
Особенности и простота использования
Beautiful Soup полезен для организации HTML-документов в структурированную информацию. Он поставляется с различными парсерами, включаяhtml.parser,lxml иhtml5lib, которые помогают обрабатывать различные типы разметки, такие как стандартный HTML, некорректный или поврежденный HTML, XHTML, HTML5 и XML. Это дает вам гибкость в выборе оптимального баланса между скоростью и точностью. Например, если вы работаете с веб-страницей, на которой отсутствуют теги или неправильно вложенные элементы, вы можете использоватьhtml5libдля анализа HTML-содержимого так же, как это делает веб-браузер.
Beautiful Soup также может помочь при выполнении задач Веб-скрейпинга, когда структура HTML непредсказуема или неорганизована. После парсинга документа вы можете легко выполнить поиск по дереву, чтобы найти узлы. Методы поиска, такие как find(), find_all() и select(), предоставляют способы доступа к элементам на основе идентификаторов, классов, текстового содержимого или атрибутов. Независимо от того, ищете ли вы все экземпляры тега или целевой элемент, использование правильного селектора обеспечивает быстрый доступ к необходимым данным с минимальными усилиями по кодированию.
Скорость
Beautiful Soup — не самый быстрый парсер, но он предлагает гибкие стратегии парсинга, которые обеспечиваютадаптивность. По умолчанию он используетhtml.parser Python, который лучше всего подходит для простых задач, таких как работа с небольшими документами для извлечения данных из блога. Если вы хотите извлечь и обработать большой объем данных, рассмотрите возможность использования другого парсера.
Поддержка современных стандартов HTML
Если вы хотите анализировать элементы и атрибутыHTML5из статических веб-страниц, то Beautiful Soup — отличный выбор. Его совместимость с парсерами гарантирует соответствие самым последнимстандартам HTML.
Документация и поддержка
Beautiful Soup имеетобширную документацию и используется более чем 850 000 пользователей наGitHub. Его документация содержит примеры, учебные пособия и ссылки, которые упрощают начало работы.
Узнайте больше о Веб-скрейпинге с Beautiful Soup здесь.
Пример кода
Чтобы установить Beautiful Soup, выполните следующую команду из командной строки или терминала:
pip3 install beautifulsoup4
В следующем фрагменте кода Beautiful Soup используется для анализа данных свеб-сайта Books to Scrape:
import requests
from bs4 import BeautifulSoup
# URL веб-страницы для скрапинга
books_page_url = "https://books.toscrape.com/"
# Получить содержимое веб-страницы
response = requests.get(books_page_url)
# Проверка успешности запроса
if response.status_code == 200:
# Разбор HTML-содержимого страницы
soup_parser = BeautifulSoup(response.text, 'html.parser')
# Поиск всех статей, содержащих информацию о книгах
book_articles = soup_parser.find_all('article', class_='product_pod')
# Пройти по каждой статье о книге и извлечь ее название и цену
for book_article in book_articles:
# Извлечь название книги
book_name = book_article.h3.a['title']
# Извлечь цену книги
book_cost = book_article.find('p', class_='price_color').text
# Вывести название и цену книги
print(f"Название: {book_name}, Цена: {book_cost}")
else:
# Вывести сообщение об ошибке, если страницу не удалось загрузить
print("Не удалось загрузить веб-страницу")
Если вы хотите протестировать этот код, сохраните его в файле с именем beautifulsoup_books_scrape.py и запустите с помощью следующей команды:
python3 beautifulsoup_books_scrape.py
Вы должны увидеть все названия и цены книг с первой страницы, выведенные на терминал или оболочку:
…вывод опущен…
Название: Soumission, Цена: 50,10 фунтов стерлингов
Название: Sharp Objects, Цена: 47,82 фунтов стерлингов
Название: Sapiens: A Brief History of Humankind, Цена: 54,23 фунтов стерлингов
Название: The Requiem Red, Цена: 22,65 фунтов стерлингов
Название: The Dirty Little Secrets of Getting Your Dream Job, Цена: 33,34 фунтов стерлингов
…вывод опущен…
Если вы новичок в Веб-скрейпинге, простота Beautiful Soup и возможность навигации по HTML-дереву делают его хорошим выбором для ваших проектов Веб-скрейпинга.
HTMLParser
HTMLParser — это библиотека, которая поставляется в комплекте с Python и позволяет осуществлять парсинг и извлекать данные из HTML-документов.
Особенности и простота использования
Хотя HTMLParser не имеет некоторых функций, предоставляемых другими библиотеками парсинга, такими какlxmlиhtml5lib, простота HTMLParser и интеграция с Python делают его хорошим выбором для проектов с простыми структурами данных, где HTML-контент является последовательным (например,скрапинг статических веб-страниц). Однако, если вы имеете дело с некорректным HTML-контентом, HTMLParser не является лучшим вариантом.
Скорость
Скорость HTMLParser достаточна для большинства случаев использования HTML-парсинга, когда у вас есть документы небольшого или среднего размера (т. е. от нескольких килобайт до пары мегабайт) и минимальные потребности в предварительной обработке. Однако для более сложных HTML-документов предпочтительнее использовать парсеры, такие как lxml.
Поддержка современных стандартов HTML
HTMLParser поддерживает базовый парсинг HTML, но может испытывать трудности с очень сложными или некорректно сформированными HTML-документами. Кроме того, он не полностью поддерживает последний стандарт HTML5.
Документация и поддержка
Поскольку HTMLParser является частью библиотеки Python, он имеет надежнуюдокументациюи поддержку. Помощь легко найти на таких платформах, как Stack Overflow, GitHub и форумах, связанных с Python.
Пример кода
Как уже упоминалось ранее, модуль HTMLParser входит в стандартную библиотеку Python и не требует дополнительной установки.
Ниже приведен пример кода, использующего html.parser для анализа HTML-данных:
from html.parser import HTMLParser
class MyHTMLParser(HTMLParser):
def handle_starttag(self, tag, attrs):
print("Encountered a start tag:", tag)
def handle_endtag(self, tag):
print("Encountered an end tag :", tag)
def handle_data(self, data):
print("Encountered some data :", data)
parser = MyHTMLParser()
html_data = """
<html>
<head><title>Example</title></head>
<body><h1>Заголовок</h1><p>Абзац.</p></body>
</html>
"""
parser.feed(html_data)
В этом скрипте вы расширяете класс HTMLParser, чтобы создать HTML-парсер, который управляет начальными тегами, конечными тегами и отображением каждого элемента.
Чтобы использовать этот код, сохраните его в файле с именем htmlparser_example.py и запустите его с помощью следующей команды из терминала или оболочки:
python3 htmlparser_example.py
Вывод показывает каждый тег и данные:
…вывод опущен…
Встречен начальный тег: html
Встречены некоторые данные :
Встречен начальный тег: head
Встречен начальный тег: title
Встречены некоторые данные : Example
Встречен конечный тег : title
Встречен конечный тег : head
…вывод опущен…
lxml
lxml — популярный выбор для Веб-скрейпинга и извлечения данных, поскольку он сочетает в себе мощь встроенных XML-библиотек с простотой использования Python.
Особенности и простота использования
lxml популярен благодаря своим эффективным и универсальным функциям для навигации и анализа HTML- и XML-документов. Он предлагает расширенные функции обработки XML, включаяXPath,XSLT и XPointer, что позволяет точно извлекать и преобразовывать данные.
Как и Beautiful Soup, lxml поддерживает древовидные структуры, что упрощает навигацию и парсинг HTML-контента. Если вы работаете с разнообразным контентом, вам может пригодиться его способность хорошо работать как с отформатированными, так и с некорректно отформатированными документами.
Скорость
lxml хорошо известен своей скоростью и эффективностью благодаря использованию библиотек C, таких какlibxml2иlibxslt. Это делает lxml быстрее других библиотек парсинга, особенно при работе с обширными документами или сложными задачами парсинга, такими как извлечение глубоко вложенных данных из больших таблиц HTML.
lxml — отличный выбор для проектов с жесткими сроками или тех, которые требуют обработки больших объемов данных.
Поддержка современных стандартов HTML
lxml может обрабатывать новейшие веб-технологии, включая файлы HTML5 и плохо структурированный HTML. Это делает lxml одним из лучших выборов для задач Веб-скрейпинга, где качество и структура HTML могут варьироваться.
Документация и поддержка
lxml имеетобширную документациюс подробными примерами, которые подходят для разработчиков всех уровней. Кроме того, вы можете найти дополнительную информацию, советы по устранению неполадок и лучшие практики на таких платформах, какStack OverflowиGitHub.
Узнайте больше о Веб-скрейпинге с lxml здесь.
Пример кода
Чтобы установить lxml, выполните следующее:
pip3 install lxml
В следующем примере показано, как осуществлять парсинг HTML-данных с помощью lxml:
from lxml import html
html_content = """
<html>
<body>
<h1>Hello, world!</h1>
<p>This is a paragraph.</p>
</body>
</html>
"""
tree = html.fromstring(html_content)
h1_text = tree.xpath('//h1/text()')[0]
print("H1 text:", h1_text)
p_text = tree.xpath('//p/text()')[0]
print("Paragraph text:", p_text)
Здесь вы используете lxml для парсинга HTML-содержимого, а затем извлекаете текст из HTML-элементов с помощью выражений XPath.
Если вы хотите протестировать lxml, сохраните этот код в файл с именем lxml_example.py, а затем запустите его с помощью следующей команды из вашей оболочки или терминала:
python3 lxml_example.py
Вы должны увидеть текст из элементов <h1> и <p>, выведенный следующим образом:
Текст H1: Привет, мир!
Текст абзаца: Это абзац.
Если вам нужен полноценный, готовый к производству парсер, который может обрабатывать сложные запросы XPath (такие как типы в XML или несколько элементов), вам следует использовать lxml.
PyQuery
PyQuery — это библиотека для Python,похожая на jQuery, которая позволяет за считанные секунды извлекать информацию со всех веб-страниц.
Особенности и простота использования
PyQuery похож на синтаксис jQuery и удобен в использовании. Вы можете легко выбирать элементы, проходить по ним в цикле, обновлять их содержимое и управлять атрибутами HTML. Это особенно полезно при выполнении таких задач, как Веб-скрейпинг, когда вам нужно извлечь данные из HTML-страниц и работать с ними.
PyQuery также поддерживает CSS-селекторы, что упрощает начало работы, если вы уже знакомы с анимацией DOM-документов с помощью jQuery.
Скорость
PyQuery использует библиотеку lxml для анализа HTML. Это упрощает использование, но делает его более медленным, чем при прямом использовании lxml.
Поддержка современных стандартов HTML
PyQuery соответствует последним стандартам HTML5, и, поскольку он использует lxml для парсинга, PyQuery может обрабатывать как структурированный, так и неструктурированный HTML.
Документация и поддержка
PyQuery предоставляет подробнуюдокументацию, которая поможет вам быстро начать работу. Хотя у негоменьшее сообщество, чем у других библиотек, его активно поддерживают более сорока участников. Существуют также другие ресурсы, такие как онлайн-форумы, Stack Overflow и различные учебные пособия, которые могут помочь вам, если у вас возникнут проблемы.
Пример кода
Чтобы установить PyQuery, выполните следующее:
pip3 install pyquery
Вот фрагмент кода, который использует pyquery для анализа HTML-данных:
from pyquery import PyQuery as pq
html_content = """
<html>
<body>
<h1>Hello, from PyQuery!</h1>
<p>This is a paragraph.</p>
</body>
</html>
"""
doc = pq(html_content)
h1_text = doc('h1').text()
print("H1 text:", h1_text)
p_text = doc('p').text()
print("Paragraph text:", p_text)
В этом фрагменте вы выполняете парсинг HTML-контента, а затем извлекаете текст из определенных элементов.
Сохраните этот код в файле с именем pyquery_example.py и запустите его с помощью следующей команды из командной строки или терминала:
python3 pyquery_example.py
Результат будет выглядеть следующим образом:
Текст H1: Привет, от PyQuery!
Текст абзаца: Это абзац.
Если вы уже знаете, как использовать jQuery, и ищете похожие функции, то PyQuery — отличный выбор.
Scrapy
Scrapy — это гибкий фреймворк с открытым исходным кодом для Веб-скрейпинга, который позволяет пользователям создавать и управлятьпаукамидля сбора информации. Он предлагает инструменты для обработки всех аспектов задачи парсинга, от управления HTTP-запросами до анализа, обработки и сохранения извлеченных данных. Фреймворк управляет всей сложностью, связанной с задачами парсинга, чтобы вы могли сосредоточиться на сборе нужной информации.
Особенности и простота использования
Scrapy разработан для простоты использования и отлично справляется с парсингом сложных веб-данных благодаря модульной структуре. Он предлагает селекторы XPath и CSS для навигации по HTML и XML, а также включает в себя такие утилиты, как регулирование запросов, подделка пользовательского агента и ротация IP-адресов, которые необходимы для крупномасштабного скрапинга.
Скорость
Scrapy эффективен. Егосетевые функциипозволяют одновременно обрабатывать запросы для извлечения данных. Это особенно полезно при работе с большими наборами данных или при скрапинге коммерческих веб-сайтов.
Поддержка современных стандартов HTML
Scrapy поддерживает стандарты HTML5 и может обрабатывать сложные веб-сайты, даже те, которые содержат динамически генерируемый JavaScript. Хотя Scrapy сам по себе не обрабатывает JavaScript, он работает вместе с такими инструментами, какSelenium, для управления страницами JavaScript.
Подробнее о том, как собирать динамический контент, читайте здесь.
Документация и поддержка
Scrapy имеет огромное количестводокументациии активное сообщество, которое его поддерживает. Официальная документация охватывает все, что вам нужно знать об основном использовании и продвинутых темах, и включает в себя множество примеров, руководств и рекомендуемых практик для поддержки разработчиков всех уровней.
Кроме того, сообщество Scrapy активно участвует в форумах и репозиториях GitHub, обеспечивая вам возможность обратиться за помощью и получить доступ к ресурсам для решения любых проблем, с которыми вы столкнетесь.
Пример кода
Чтобы установить Scrapy, выполните следующее:
pip3 install scrapy
Ниже приведен пример использования паука Scrapy для извлечения данных:
import scrapy
class QuotesSpider(scrapy.Spider):
name = "quotes"
start_urls = [
'http://quotes.toscrape.com/page/1/',
]
def parse(self, response):
for quote in response.css('div.quote'):
yield {
'text': quote.css('span.text::text').get(),
'author': quote.css('small.author::text').get(),
'tags': quote.css('div.tags a.tag::text').getall(),
}
Этот скрипт определяет класс паука, устанавливает начальные URL-адреса и указывает, как проводить парсинг ответа для извлечения данных.
Сохраните этот код в файле с именем quotes_spider.py и запустите его с помощью следующей команды из терминала или оболочки:
scrapy runspider quotes_spider.py -o quotes.json
При выполнении этого кода Scrapy просматривает страницу Quotes to Scrape и извлекает и анализирует цитаты с этой страницы с указанием их авторов и тегов. Затем Scrapy сохраняет извлеченные данные в файлеquotes.json, который выглядит следующим образом:
[
{"text": "u201cМир, который мы создали, является результатом нашего мышления. Его невозможно изменить, не изменив наше мышление.u201d", "author": "Альберт Эйнштейн", "tags": ["изменение", "глубокие мысли", "мышление", "мир"]},
{"text": "u201cIt is our choices, Harry, that show what we truly are, far more than our abilities.u201d", "author": "J.K. Rowling", "tags": ["abilities", "choices"]}
…вывод опущен...
]
Для сложных проектов по извлечению данных из веб-сайтов, где у вас есть особые потребности, Scrapy — отличный вариант благодаря своим многофункциональным инструментам и масштабируемости.
Заключение
В этой статье вы узнали о пяти HTML-парсерах для Python, включая Beautiful Soup, HTMLParser, lxml, PyQuery и Scrapy.
Beautiful Soup отлично подходит для начинающих благодаря своей простоте. HTMLParser — это легкий вариант для базовых задач парсинга. lxml стоит рассмотреть, если вам нужна более высокая производительность и поддержка XPath. PyQuery привносит в Python простоту, похожую на jQuery. Scrapy — это фреймворк, который стоит использовать, если вы занимаетесь крупномасштабными проектами по сбору данных.
Хотите пропустить скрейпинг и сразу получить данные? Зарегистрируйтесь, чтобы ознакомиться с нашими наборами данных, и скачайте бесплатный образец прямо сейчас.