7 days of WordPress plugins, themes & templates - for free!* Unlimited asset downloads! Start 7-Day Free Trial
Advertisement
  1. Code
  2. Python

Скрапинг веб-страниц в Python с Beautiful Soup: основы

Read Time: 7 mins
This post is part of a series called Scraping Webpages in Python with Beautiful Soup.
Scraping Webpages in Python With Beautiful Soup: Search and DOM Modification

Russian (Pусский) translation by Anna k.Ivanova (you can also view the original English article)

В предыдущем уроке я показал вам, как использовать модуль Requests для доступа к веб-страницам с использованием Python. В этом учебном пособии рассмотрено множество тем, таких как получение запросов GET / POST и программная загрузка таких файлов, как изображения или PDF. Единственное, чего не было в этом учебнике - руководства по скрапингу веб-страниц, к которым вы обращались с помощью requests, для извлечения необходимой информации.

В этом уроке вы узнаете о Beautiful Soup, который представляет собой библиотеку Python для извлечения данных из файлов HTML. В этом уроке основное внимание будет уделено изучению основ библиотеки, а более подробные темы будут рассмотрены в следующем учебном пособии. Обратите внимание, что в этом руководстве для всех примеров используется Beautiful Soup 4.

Установка

Вы можете установить Beautiful Soup 4 с помощью pip. Название пакета beautifulsoup4. Он должен работать как на Python 2, так и на Python 3.

Если в вашей системе нет pip, вы можете напрямую загрузить исходный tarball Beautiful Soup 4 и установить его с помощью setup.py.

BeautifulSoup изначально упакован как код Python 2. Когда вы устанавливаете его для использования с Python 3, он автоматически обновляется до кода Python 3. Код не будет конвертирован, если вы не установите пакет. Вот несколько распространенных ошибок, которые вы могли заметить:

  • «Нет модуля с именем HTMLParser» ImportError возникает, когда вы запускаете версию кода Python 2 под Python 3.
  • «Нет модуля с именем html.parser» ImportError возникает, когда вы запускаете версию кода Python 3 под Python 2.

Обе приведенные выше ошибки могут быть исправлены путем удаления и переустановки Beautiful Soup.

Установка парсера

Прежде чем обсуждать различия между различными парсерами, которые вы можете использовать с Beautiful Soup, давайте напишем код для создания soup.

Объект BeautifulSoup может принимать два аргумента. Первым аргументом является фактическая разметка, а второй аргумент - синтаксический анализатор, который вы хотите использовать. Различные синтаксические анализаторы: html.parser, lxml и html5lib. Парсер lxml имеет две версии: парсер HTML и синтаксический анализатор XML.

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

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

Различия, описанные в приведенном выше примере, имеют значение только при анализе невалидного HTML. Тем не менее, большая часть HTML в Интернете невалидна, и знание этих различий поможет вам отладить некоторые ошибки синтаксического анализа и решить, какой парсер вы хотите использовать в проекте. Как правило, анализатор lxml является очень хорошим выбором.

Объекты в Beautiful Soup

Beautiful Soup анализирует данный HTML-документ в дерево объектов Python. Есть четыре основных объекта Python, о которых вам нужно знать: Tag, NavigableString, BeautifulSoup и Comment.

Объект Tag ссылается на фактический тег XML или HTML в документе. Вы можете получить доступ к имени тега, используя tag.name. Вы также можете установить имя тега на что-то еще. Изменение имени будет видно в разметке, созданной Beautiful Soup.

Вы можете получить доступ к различным атрибутам, таким как класс и идентификатор тега, используя tag['class'] и tag['id'] соответственно. Вы также можете получить доступ ко всему словарю атрибутов с помощью tag.attrs. Вы также можете добавлять, удалять или изменять атрибуты тега. Атрибуты элемента, такие как class, который может принимать несколько значений, сохраняются в виде списка.

Текст в теге хранится как NavigableString в Beautiful Soup. Он имеет несколько полезных методов, таких как replace_with("string"), чтобы заменить текст в теге. Вы также можете преобразовать строку NavigableString в строку unicode, используя unicode().

Beautiful Soup также позволяет получить доступ к комментариям на веб-странице. Эти комментарии хранятся как объект Comment, который также является в основном NavigableString.

Вы уже узнали о объекте BeautifulSoup в предыдущем разделе. Он используется для представления документа в целом. Поскольку он не является фактическим объектом, он не имеет никаких имен или атрибутов.

Получение Title, Headings и Links

Вы можете легко извлечь заголовок страницы и другие такие данные с помощью Beautiful Soup. Давайте соберем данные со страницы Википедии о Python. Во-первых, вам нужно будет получить разметку страницы, используя следующий код на основе учебника модуля Requests для доступа к веб-страницам.

Теперь, когда вы создали soup, вы можете получить заголовок веб-страницы, используя следующий код:

Вы также можете получить и другую информацию с веб-страницы, такую как основной заголовок или первый абзац, их классы или атрибут id.

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

Навигация по DOM

Вы можете перемещаться по дереву DOM с помощью регулярных имен тегов. Связывание имен тегов может помочь вам более глубоко перемещаться по дереву. Например, вы можете получить первую ссылку в первом абзаце данной страницы Википедии, используя soup.p.a. Все ссылки в первом абзаце можно получить, используя soup.p.find_all('a').

Вы также можете получить доступ ко всем дочерним элементам тега в виде списка с помощью tag.contents. Чтобы получить детей по определенному индексу, вы можете использовать tag.contents[index]. Вы также можете перебирать дочерние теги с помощью атрибута .children.

Оба .children и .contents полезны только тогда, когда вы хотите получить доступ к потомкам первого или первого уровня тега. Чтобы получить всех потомков, вы можете использовать атрибут .descendants.

Вы также можете получить доступ к родительскому элементу элемента, используя атрибут .parent. Аналогично, вы можете получить доступ ко всем предкам элемента, используя атрибут .parents. Родитель тега <html> верхнего уровня - это сам объект BeautifulSoup, а его родительский элемент - None.

Вы можете получить доступ к предыдущему и следующему родственнику элемента, используя атрибуты .previous_sibling и .next_sibling.

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

Вы также можете перебирать всех братьев элемента с использованием .previous_siblings и .next_siblings.

Вы можете перейти к элементу, который приходит сразу после текущего элемента, используя атрибут .next_element. Чтобы получить доступ к элементу, который приходит непосредственно перед текущим элементом, используйте атрибут .previous_element.

Аналогично, вы можете перебирать все элементы, которые поступают до и после текущего элемента, используя .previous_elements и .next_elements соответственно.

Финальные мысли

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

В следующей части этой серии вы узнаете, как использовать библиотеку Beautiful Soup для поиска и изменения DOM.

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Advertisement
Scroll to top
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.