Как установить beautifulsoup 4 python 3 windows
В предыдущем уроке я показал вам, как использовать модуль 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 для парсинга данных с веб сайтов.
Введение
Веб парсинг это метод программирования для извлечения данных с веб-сайтов. Процесс получения данных с веб-сайтов может быть выполнен вручную, но это медленный и утомительный процесс, когда данных много. Web Scraping обеспечивает более автоматизированный и простой способ извлечения информации с веб-сайтов.
Веб парсинг это больше, чем просто получение данных: этот метод также может помочь вам архивировать данные и отслеживать изменения в данных онлайн.
Он также известен как веб скрейпинг или веб паук.
В интернете очень много информации на эту тему, и она растет довольно быстро. Люди парсят интернет по многим причинам и вот некоторые из них:
- Мониторинг изменения цен в режиме онлайн.
- Сбор списка недвижимости.
- Извлечение последних новостей с новостного сайта.
- Мониторинг погодных данных.
- Исследование чего-либо.
- Извлечение большого объема данных для интеллектуального анализа данных и так далее.
Все сводится к тому, какие данные вы хотите получить или отследить в интернете.
Инструменты
Существует множество инструментов и языков программирования для очистки контента в интернете, но Python обеспечивает плавный и простой процесс. Веб-скрейпинг может быть выполнен на Python с помощью таких библиотек, как Requests, BeautifulSoup, Scrapy и Selenium.
Beautifulsoup это лучший выбор при запуске веб-скрейпинга в Python, поэтому мы будем использовать BeautifulSoup4 и библиотеку запросов Python для Web Scraping.
Не все веб-сайты разрешают собирать данные, поэтому перед сбором вам следует проверить политику веб-сайта.
Реализация
Есть всего три шага в очистке веб-страницы:
- Проверка веб-страницы.
- Извлечение веб-страницы.
- Простая очистка веб-страницы.
Сбор заголовков последних технических новостей
Проверка источника данных
Обладая некоторыми базовыми знаниями в области 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-элемента:
Читайте также: