HTML-парсеры Python

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

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

  • С открытым исходным кодом
  • Активно поддерживается
  • Легкий
  • Хорошая поддержка сообщества
  • Высокая производительность

BeautifulSoup

BeautifulSoup — это HTML-парсер, но он также гораздо больше — это легкая и универсальная библиотека, которая позволяет извлекать данные и информацию из файлов HTML и XML. Вы можете использовать ее для парсига, а также для изменения HTML-файлов. Хотя она относительно проста и легка в изучении, это очень мощный фреймворк. Вы можете выполнять даже более сложные проекты, используя BeautifulSoup как единственную библиотеку парсинга.

Пакет BeautifulSoup в Python не встроен, поэтому вам нужно установить его перед использованием. К счастью, он очень удобен в использовании и прост в настройке. Просто установите его, запустив 
pip install beautifulsoup4. После этого вам нужно будет только ввести HTML-файл, который вы хотите проанализировать. Затем вы можете использовать многочисленные функции BeautifulSoup для поиска и извлечения нужных вам данных, и все это всего в нескольких строках кода.

Вот HTML-код:

html_doc = """<html><head><title>The Dormouse's story</title></head>
<body>
<p class="title"><b>The Dormouse's story</b></p>
 
<p class="story">Once upon a time there were three little sisters; and their names were
<a href="http://example.com/elsie" class="sister" id="link1">Elsie</a>,
<a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and
<a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>;
and they lived at the bottom of a well.</p>
 
<p class="story">...</p>
"""

Перед анализом вам необходимо импортировать библиотеку BeautifulSoup с помощью следующего кода:

from bs4 import BeautifulSoup

Теперь, вы можете обработать HTML с помощью этой простой строки кода:

soup = BeautifulSoup(html_doc, 'html.parser')

С помощью этой строки вы просто передаете документ, который хотите обработать (в данном случае «html_doc») в BeautifulSoup конструктор, который затем занимается разбором. Вы, вероятно, заметили, что помимо документа, который вы хотите проанализировать, конструктор 
BeautifulSoup принимает второй аргумент. Именно здесь вы передаете анализатор, который хотите использовать. Если вместо html.parser вы предпочитаете lxml, вы можете просто запустить следующее:

soup = BeautifulSoup(html_doc, 'lxml')

Имейте в виду, что разные парсеры выдают разные результаты.

Теперь, когда HTML обработан, вы можете найти и извлечь любые элементы, которые вы ищете. Например, найти элемент title так же просто, как запустить soup.title. Вы можете получить фактический заголовок с помощью soup.title.string. Некоторые популярные функции, предлагаемые BeautifulSoup, включают find() и особенно find_all(). Они делают чрезвычайно простым поиск любых элементов, которые вы хотите. Например, найти все абзацы или ссылки в HTML так же просто, как запустить soup.find_all('p') или soup.find_all('a').

В двух словах, BeautifulSoup — это мощная, гибкая и простая в использовании библиотека для веб-скрейпинга. Она отлично подходит для всех, но благодаря обширной документации и простоте использования она особенно подходит новичкам. Чтобы узнать больше обо всех возможностях BeautifulSoup, ознакомьтесь с документацией .

lxml

Другой высокопроизводительный HTML-парсер — lxml. Вы уже видели его в предыдущем разделе — BeautifulSoup поддерживает использование парсера lxml, просто передавая его lxml в качестве второго аргумента конструктору BeautifulSoup. Ранее lxml был известен своей скоростью, а BeautifulSoup — способностью обрабатывать запутанный HTML. Однако теперь, когда они поддерживают друг друга, вы получаете и скорость, и способность обрабатывать запутанный HTML в одном пакете.

С помощью lxml вы можете извлекать данные как из XML, так и из сломанного HTML. Это очень быстро, безопасно и просто в использовании — благодаря Pythonic API — и не требует ручного управления памятью. Он также поставляется со специальным пакетом для разбора HTML.

Как и в случае с BeautifulSoup, для использования lxml вам сначала нужно установить его, что легко сделать с помощью pip install lxml. После установки есть несколько различных функций для разбора HTML, таких как parse() и fromstring(). Например, то же самое html_doc из примера BeautifulSoup можно разобрать с помощью следующего фрагмента кода:

from lxml import etree
from io import StringIO

parser = etree.HTMLParser()

tree = etree.parse(StringIO(html_doc), parser)

Теперь файл HTML будет содержаться в tree. Оттуда вы можете извлечь необходимые вам данные, используя различные методы, такие как XPath или CSSSelect. Вы можете узнать, как это сделать подробно, из обширной документации lxml

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

pyquery

Если вам нравится jQuery API и вы хотели бы его в Python, то pyquery для вас. Это библиотека, которая предлагает как XML, так и HTML-парсинг, с высокой скоростью и API, очень похожим на jQuery.

Как и другие HTML-парсеры в этом обзоре, pyquery позволяет вам просматривать и извлекать информацию из XML- или HTML-файла. Он также позволяет вам манипулировать HTML-файлом, включая добавление, вставку или удаление элементов. Вы можете создавать деревья документов из простого HTML, а затем манипулировать ими и извлекать из них данные. Кроме того, поскольку pyquery включает в себя множество вспомогательных функций, он помогает вам экономить время, не написывая так много кода самостоятельно.

Чтобы использовать pyquery, вам сначала нужно установить его с помощью , 
pip install pyquery, а затем импортировать его с помощью from pyquery import PyQuery as pq. После этого вы сможете загружать документы из строк, URL-адресов или даже lxml. Вот код, который позволит вам это сделать:

d = pq(html_doc) # loads the html_doc we introduced previously
d = pq(url="https://peregulma.ru/") # loads from an inputted url

pyquery по сути делает то же самое, что lxml и BeautifulSoup. Главное отличие заключается в его синтаксисе, который намеренно очень похож на синтаксис jQuery. Если вы знакомы с jQuery, это может быть особенно полезным вариантом для вас.

Однако pyquery не так популярен, как BeautifulSoup или lxml, поэтому его поддержка сообществом сравнительно слабая. Тем не менее, он легкий, активно поддерживается и имеет отличную документацию .

Заключение

Объем данных в Интернете увеличивается с каждым днем, а потребность в обработке этих данных и превращении их во что-то полезное растет в свою очередь. Чтобы эффективно собирать данные, сначала нужно разобрать HTML веб-страницы и извлечь из нее данные. Для разбора HTML вам понадобится HTML-парсер.

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

Для вашего следующего проекта по парсингу веб-страниц рассмотрите возможность использования одного из парсеров. Для большинства случаев использования BeautifulSoup, вероятно, является лучшим местом для начала, а lxml является жизнеспособной альтернативой. Если вы предпочитаете jQuery API, то вы можете выбрать pyquery.

Мы используем cookie-файлы для наилучшего представления нашего сайта. Продолжая использовать этот сайт, вы соглашаетесь с использованием cookie-файлов.
Принять