Как установить beautifulsoup 4 python 3 windows

Обновлено: 06.07.2024

В предыдущем уроке я показал вам, как использовать модуль 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') .

Вы также можете получить доступ к родительскому элементу элемента, используя атрибут .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.

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

Статья ориентирована на новичков, таких же как и я.

Начало


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


Как видите, сервер отдал нам красивый контейнер новостей (которых, кстати, больше чем на основном сайте, что нам на руку) без рекламы и мусора.

Давайте рассмотрим исходный код, чтобы понять с чем мы имеем дело.


Практика

(убедитесь, что стоит последняя версия pip)

Переходим в редактор кода и импортируем наши библиотеки:


Для начала сохраним наш URL в переменную:


Теперь отправим GET()-запрос на сайт и сохраним полученное в переменную 'page':


Код вернул нам статус код '200', значит это, что мы успешно подключены и все в полном порядке.

Теперь создадим два списка (позже я объясню для чего они нужны):


Самое время воспользоваться BeautifulSoup4 и скормить ему наш page, указав в кавычках как он нам поможет 'html.parcer':


Если попросить его показать, что он там сохранил:


Нам вылезет весь html-код нашей страницы.

Теперь воспользуемся функцией поиска в BeautifulSoup4:


Давайте разберём поподробнее, что мы тут написали.


Как видите, вместе с текстом новостей вывелись теги 'a', 'span', классы 'lenta' и 'time2', а также 'time2 time3', в общем все, что он нашел по нашим пожеланиям.

Обратите внимание, что мы используем '.text', чтобы переформатировать строки в нашем списке из 'bs4.element.ResultSet', который использует BeautifulSoup для своих поисков, в обычный текст.

Однажды я застрял на этой проблеме надолго в силу недопонимания работы форматов данных и неумения использовать debug, будьте осторожны. Таким образом теперь мы можем сохранять эти данные в новый список и использовать все методы списков, ведь теперь это обычный текст и, в общем, делать с ним, что нам захочется.

Выведем наши данные:


Вот что мы получаем:


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

BeautifulSoup4 (bs4) - это библиотека Python для извлечения данных из файлов HTML и XML. Для естественной навигации, поиска и изменения дерева HTML, модуль BeautifulSoup4, по умолчанию использует встроенный в Python парсер | html.parser |. BS4 так же поддерживает ряд сторонних парсеров Python, таких как lxml , html5lib и xml (для разбора XML-документов).

Установка BeautifulSoup4 в виртуальное окружение:

Содержание:

Выбор парсера для использования в BeautifulSoup4.

BeautifulSoup4 представляет один интерфейс для разных парсеров, но парсеры неодинаковы. Разные парсеры, анализируя один и того же документ создадут различные деревья HTML. Самые большие различия будут между парсерами HTML и XML. Так же парсеры различаются скоростью разбора HTML документа.

Если дать BeautifulSoup4 идеально оформленный документ HTML, то различий построенного HTML-дерева не будет. Один парсер будет быстрее другого, но все они будут давать структуру, которая выглядит точно так же, как оригинальный документ HTML. Но если документ оформлен с ошибками, то различные парсеры дадут разные результаты.

Различия в построении HTML-дерева разными парсерами, разберем на короткой HTML-разметке: <a></p> .

Парсер lxml .

  • Для запуска примера, необходимо установить модуль lxml .
  • Очень быстрый, имеет внешнюю зависимость от языка C.
  • Нестрогий.

Обратите внимание, что тег <a> заключен в теги <body> и <html> , а висячий тег </p> просто игнорируется.

Парсер html5lib .

  • Для запуска примера, необходимо установить модуль html5lib .
  • Ну очень медленный.
  • Разбирает страницы так же, как это делает браузер, создавая валидный HTML5.

Обратите внимание, что парсер html5lib НЕ игнорирует висячий тег </p> , и к тому же добавляет открывающий тег <p> . Также html5lib добавляет пустой тег <head> ( lxml этого не сделал).

Встроенный в Python парсер html.parser .

  • Не требует дополнительной установки.
  • Приличная скорость, но не такой быстрый, как lxml .
  • Более строгий, чем html5lib .

Как и lxml , встроенный в Python парсер игнорирует закрывающий тег </p> . В отличие от html5lib , этот парсер не делает попытки создать правильно оформленный HTML-документ, добавив теги <html> или <body> .

Вывод: Парсер html5lib использует способы, которые являются частью стандарта HTML5, поэтому он может претендовать на то, что его подход самый "правильный".

Основные приемы работы с BeautifulSoup4.

Чтобы разобрать HTML-документ, необходимо передать его в конструктор класса BeautifulSoup() . Можно передать строку или открытый дескриптор файла:

Первым делом документ конвертируется в Unicode, а HTML-мнемоники конвертируются в символы Unicode:

Дальнейшие примеры будут разбираться на следующей HTML-разметке.

Передача этого HTML-документа в конструктор класса BeautifulSoup() создает объект, который представляет документ в виде вложенной структуры:

Навигация по структуре HTML-документа:

Перемещаться по одному уровню можно при помощи атрибутов .previous_sibling и .next_sibling . Например, в представленном выше HTML, теги <a> обернуты в тег <p> - следовательно они находятся на одном уровне.

Так же можно перебрать одноуровневые элементы данного тега с помощью .next_siblings или .previous_siblings .

Атрибут .next_element строки или HTML-тега указывает на то, что было разобрано непосредственно после него. Это могло бы быть тем же, что и .next_sibling , но обычно результат резко отличается.

Возьмем последний тег <a> , его .next_sibling является строкой: конец предложения, которое было прервано началом тега <a> :

Однако .next_element этого тега <a> - это то, что было разобрано сразу после тега <a> - это слово Tillie, а не остальная часть предложения.

Это потому, что в оригинальной разметке слово Tillie появилось перед точкой с запятой. Парсер обнаружил тег <a> , затем слово Tillie, затем закрывающий тег </a> , затем точку с запятой и оставшуюся часть предложения. Точка с запятой находится на том же уровне, что и тег <a> , но слово Tillie встретилось первым.

Атрибут .previous_element является полной противоположностью .next_element . Он указывает на элемент, который был обнаружен при разборе непосредственно перед текущим:

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

Извлечение URL-адресов.

Одна из распространенных задач, это извлечение URL-адресов, найденных на странице в HTML-тегах <a> :

Извлечение текста HTML-страницы.

Другая распространенная задача - извлечь весь текст со HTML-страницы:

Поиск тегов по HTML-документу:

Найти первый совпавший HTML-тег можно методом BeautifulSoup.find() , а всех совпавших элементов - BeautifulSoup.find_all() .

Поиск тегов при помощи CSS селекторов:

Поиск тега под другими тегами:

Поиск тега непосредственно под другими тегами:

Поиск одноуровневых элементов:

Поиск тега по классу CSS:

Поиск тега по ID:

Дочерние элементы.

Извлечение НЕПОСРЕДСТВЕННЫХ дочерних элементов тега. Если посмотреть на HTML-разметку в коде ниже, то, непосредственными дочерними элементами первого <ul> будут являться три тега <li> и тег <ul> со всеми вложенными тегами.

Извлечение ВСЕХ дочерних элементов. Эта операция похожа на рекурсивный обход HTML-дерева в глубину от выбранного тега.

Обратите внимание, что простой текст, который находится внутри тега, так же считается дочерним элементом этого тега.

Если внутри тега есть более одного дочернего элемента (как в примерен выше) и необходимо извлечь только текст, то можно использовать атрибут .strings или генератор .stripped_strings .

Генератор .stripped_strings дополнительно удаляет все переводы строк \n и пробелы между тегами в исходном HTML-документе.

Родительские элементы.

Что бы получить доступ к родительскому элементу, необходимо использовать атрибут .parent .

Taк же можно перебрать всех родителей элемента с помощью атрибута .parents .

Изменение имен тегов HTML-документа:

Изменение HTML-тега <p> на тег <div> :

Добавление новых тегов в HTML-документ.

Добавление нового тега в дерево HTML:

Добавление новых тегов до/после определенного тега или внутрь тега.

Удаление и замена тегов в HTML-документе.

Удаляем тег или строку из дерева HTML:

Заменяем тег и/или строку в дереве HTML:

Изменение атрибутов тегов HTML-документа.

У тега может быть любое количество атрибутов. Тег <b > имеет атрибут id , значение которого равно boldest . Доступ к атрибутам тега можно получить, обращаясь с тегом как со словарем:

Использование библиотеки Beautifulsoup в Python

Статьи

Это руководство для начинающих по использованию библиотеки beautifulsoup для парсинга данных с веб сайтов.

Введение

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

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

Он также известен как веб скрейпинг или веб паук.

В интернете очень много информации на эту тему, и она растет довольно быстро. Люди парсят интернет по многим причинам и вот некоторые из них:

  • Мониторинг изменения цен в режиме онлайн.
  • Сбор списка недвижимости.
  • Извлечение последних новостей с новостного сайта.
  • Мониторинг погодных данных.
  • Исследование чего-либо.
  • Извлечение большого объема данных для интеллектуального анализа данных и так далее.

Все сводится к тому, какие данные вы хотите получить или отследить в интернете.

Инструменты

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

Beautifulsoup это лучший выбор при запуске веб-скрейпинга в Python, поэтому мы будем использовать BeautifulSoup4 и библиотеку запросов Python для Web Scraping.

Не все веб-сайты разрешают собирать данные, поэтому перед сбором вам следует проверить политику веб-сайта.

Реализация

Есть всего три шага в очистке веб-страницы:

  1. Проверка веб-страницы.
  2. Извлечение веб-страницы.
  3. Простая очистка веб-страницы.

Сбор заголовков последних технических новостей

Проверка источника данных

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

Извлечение веб-страницы

Чтобы собрать информацию с веб-страницы, вы должны сначала извлечь (получить или загрузить) страницу. Но обратите внимание, что компьютеры не видят веб-страницы так, как мы, люди, то есть красивые макеты, цвета, шрифты и тому подобное.

Компьютеры видят и понимают веб-страницы как код, то есть исходный код, который мы видим, когда просматриваем исходный код в браузере, нажимая CTRL + U, как мы это делали при проверке веб-страницы.

Чтобы получить веб-страницу с помощью Python, я буду использовать библиотеку requests, которую вы можете установить с помощью pip:

Чтобы получить веб-страницу с помощью библиотеки запросов, я пишу код:

response.status_code возвращает код ответа, указывающий, был ли запрос успешным или нет. Код состояния 200 указывает на то, что запрос был успешным, 4** означает ошибку клиента (ошибку с вашей стороны) и 5** означает ошибку сервера.

response.content возвращает содержимое ответа, которое является исходным кодом веб-страницы, и это тот же исходный код, который доступен вам при просмотре его в веб-браузере.

Использование BeautifulSoup

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

Beautiful Soup это библиотека Python для извлечения данных из HTML-и XML-файлов. Я буду использовать ее для извлечения необходимых нам данных из нашего исходного кода HTML.

Устанавливаем BeautifulSoup через pip:

Прежде чем сделать какое-либо извлечение, я должен разобрать HTML, который у нас есть:

Класс BeautifulSoup требует двух аргументов: исходного кода HTML страницы, который хранится в response.content, и HTML-parser.

HTML-parser это простой модуль синтаксического анализа HTML, встроенный в Python и BeautifulSoup, который нужен для разбора response.content (исходный код HTML).

Извлечение заголовка и тела страницы

После синтаксического анализа с помощью BeautifulSoup анализируемый HTML-код хранится в переменной Soup, которая является основой всего извлечения, которое мы собираемся сделать. Давайте начнем с извлечения заголовка страницы, элементов head и body:

soup.title возвращает элемент title веб-страницы в формате html(…). Аналогично soup.head и soup.body возвращают элементы head и body веб-страницы.

Поиск HTML-элементов

Выборка только заголовков, head и body веб-страницы по-прежнему дает нам слишком много нежелательных данных. Нам нужны только некоторые данные из тела HTML, такие как поиск определённых HTML-элементов, например, div, a, p, footer, img, и так далее. Моя цель собрать заголовки новостей с веб-страницы. Когда я проводил проверку, вы заметили, что новостные статьи хранились с разбивкой по тегам. Давайте посмотрим, будет ли полезно найти все элементы a на веб-странице:

Поиск всех тэгов a это еще один шаг ближе к цели, но мне все равно нужно быть более конкретным и находить только те элементы a с нужными нам данными.

Как вы можете видеть выше, заголовки новостей находятся в элементах a с именем класса post__title_link, то есть:

Таким образом, нам нужно будет найти только элементы a с классом post__title_link.

Поиск HTML-элементов по имени класса

Чтобы найти все элементы a с классом post__title_link, я пишу следующий код:

ищет все элементы a названием класса post__title_link и возвращает их списком.

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

Мы почти закончили, у меня есть список элементов <а> с нашими новостными заголовками в них. Мы должны извлечь их из HTML-элемента (извлечь текст из элементов).

Извлечение текста из HTML-элементов

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

Читайте также: