Поиск по сайту:

Как работать с веб-данными с помощью запросов и Beautiful Soup с Python 3


Введение

Интернет предоставляет нам больше данных, чем любой из нас может прочитать и понять, поэтому мы часто хотим работать с этой информацией программно, чтобы понять ее смысл. Иногда эти данные предоставляются нам создателями веб-сайтов через .csv или файлы со значениями, разделенными запятыми, или через API (интерфейс прикладного программирования). В других случаях нам нужно самим собирать текст из Интернета.

В этом руководстве будет рассказано, как работать с пакетами Beautiful Soup Python, чтобы использовать данные с веб-страниц. Модуль «Запросы» позволяет интегрировать ваши программы Python с веб-сервисами, а модуль «Красивый суп» предназначен для быстрой очистки экрана. С помощью интерактивной консоли Python и этих двух библиотек мы пройдемся по тому, как собрать веб-страницу и работать с имеющейся там текстовой информацией.

Предпосылки

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

Кроме того, вы должны быть знакомы с:

  • Интерактивная консоль Python
  • Импорт модулей в Python 3
  • Структура и теги HTML

Настроив среду разработки и помня об этих концепциях программирования на Python, давайте начнем работать с Requests и Beautiful Soup.

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

Начнем с активации нашей среды программирования Python 3. Убедитесь, что вы находитесь в каталоге, где находится ваша среда, и выполните следующую команду:

  1. . my_env/bin/activate

Чтобы работать с веб-страницами, нам нужно будет запросить страницу. Библиотека Requests позволяет вам использовать HTTP в ваших программах Python в удобном для человека виде.

Активировав нашу среду программирования, мы установим Requests с помощью pip:

  1. pip install requests

Пока библиотека Requests устанавливается, вы получите следующий вывод:

Output
Collecting requests Downloading requests-2.26.0-py2.py3-none-any.whl (88kB) 100% |████████████████████████████████| 92kB 3.1MB/s ... Installing collected packages: chardet, urllib3, certifi, idna, requests Successfully installed certifi-2017.4.17 chardet-3.0.4 idna-2.5 requests-2.26.0 urllib3-1.21.1

Если бы Requests был установлен ранее, вы бы получили ответ, подобный следующему, из окна терминала:

Output
Requirement already satisfied ...

Установив запросы в нашу среду программирования, мы можем перейти к установке следующего модуля.

Установка Beautiful Soup

Как и в случае с Requests, мы установим Beautiful Soup с помощью pip. Текущую версию Beautiful Soup 4 можно установить с помощью следующей команды:

  1. pip install beautifulsoup4

После запуска этой команды вы должны увидеть вывод, похожий на следующий:

Output
Collecting beautifulsoup4 Downloading beautifulsoup4-4.10.0-py3-none-any.whl (97 kB) |████████████████████████████████| 97 kB 6.8 MB/s Collecting soupsieve>1.2 Downloading soupsieve-2.3.1-py3-none-any.whl (37 kB) Installing collected packages: soupsieve, beautifulsoup4 Successfully installed beautifulsoup4-4.10.0 soupsieve-2.3.1

Теперь, когда и Beautiful Soup, и Requests установлены, мы можем перейти к пониманию того, как работать с библиотеками для очистки веб-сайтов.

Сбор веб-страницы с запросами

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

Давайте сначала перейдем в интерактивную консоль Python:

  1. python

Отсюда мы импортируем модуль запросов, чтобы мы могли собрать образец веб-страницы:

  1. import requests

Мы назначим URL (ниже) примера веб-страницы mockturtle.html переменной url:

  1. url = 'https://assets.linux-console.net/articles/eng_python/beautiful-soup/mockturtle.html'

Затем мы можем присвоить результат запроса этой страницы переменной page с помощью метода request.get(). Мы передаем URL-адрес страницы (который был назначен переменной url) этому методу.

  1. page = requests.get(url)

Переменной page назначается объект Response:

>>> page
<Response [200]>
>>> 

Объект Response выше указывает нам свойство status_code в квадратных скобках (в данном случае 200). Этот атрибут можно вызвать явно:

>>> page.status_code
200
>>> 

Возвращенный код 200 говорит нам об успешной загрузке страницы. Коды, начинающиеся с цифры 2, обычно указывают на успех, а коды, начинающиеся с 4 или 5, указывают на то, что произошла ошибка. Вы можете узнать больше о кодах состояния HTTP в определениях кодов состояния W3C.

Для работы с веб-данными нам понадобится доступ к текстовому содержимому веб-файлов. Мы можем прочитать содержимое ответа сервера с помощью page.text (или page.content, если мы хотим получить доступ к ответу в байтах).

  1. page.text

Как только мы нажмем ENTER, мы получим следующий вывод:

Output
'<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"\n "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">\n\n<html lang="en-US" xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">\n<head>\n <meta http-equiv="content-type" content="text/html; charset=us-ascii" />\n\n <title>Turtle Soup</title>\n</head>\n\n<body>\n <h1>Turtle Soup</h1>\n\n <p class="verse" id="first">Beautiful Soup, so rich and green,<br />\n Waiting in a hot tureen!<br />\n Who for such dainties would not stoop?<br />\n Soup of the evening, beautiful Soup!<br />\n Soup of the evening, beautiful Soup!<br /></p>\n\n <p class="chorus" id="second">Beau--ootiful Soo--oop!<br />\n Beau--ootiful Soo--oop!<br />\n Soo--oop of the e--e--evening,<br />\n Beautiful, beautiful Soup!<br /></p>\n\n <p class="verse" id="third">Beautiful Soup! Who cares for fish,<br />\n Game or any other dish?<br />\n Who would not give all else for two<br />\n Pennyworth only of Beautiful Soup?<br />\n Pennyworth only of beautiful Soup?<br /></p>\n\n <p class="chorus" id="fourth">Beau--ootiful Soo--oop!<br />\n Beau--ootiful Soo--oop!<br />\n Soo--oop of the e--e--evening,<br />\n Beautiful, beauti--FUL SOUP!<br /></p>\n</body>\n</html>\n' >>>

Здесь мы видим, что был распечатан полный текст страницы со всеми ее HTML-тегами. Тем не менее, это трудно читать, потому что нет большого интервала.

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

Шагая по странице с Beautiful Soup

Библиотека Beautiful Soup создает дерево синтаксического анализа из проанализированных документов HTML и XML (включая документы с незакрытыми тегами или супом тегов и другой искаженной разметкой). Эта функциональность сделает текст веб-страницы более читаемым, чем то, что мы видели в модуле «Запросы».

Для начала мы импортируем Beautiful Soup в консоль Python:

  1. from bs4 import BeautifulSoup

Затем мы пропустим документ page.text через модуль, чтобы получить объект BeautifulSoup, то есть дерево анализа из этой проанализированной страницы, которое мы получим от запуска встроенного в Python html.parser поверх HTML. Сконструированный объект представляет документ mockturtle.html как вложенную структуру данных. Это присваивается переменной soup.

  1. soup = BeautifulSoup(page.text, 'html.parser')

Чтобы отобразить содержимое страницы на терминале, мы можем распечатать ее с помощью метода prettify(), чтобы превратить дерево синтаксического анализа Beautiful Soup в красиво отформатированную строку Unicode.

  1. print(soup.prettify())

Это отобразит каждый тег HTML в отдельной строке:

Output
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html lang="en-US" xml:lang="en-US" xmlns="http://www.w3.org/1999/xhtml"> <head> <meta content="text/html; charset=utf-8" http-equiv="content-type"/> <title> Turtle Soup </title> </head> <body> <h1> Turtle Soup </h1> <p class="verse" id="first"> Beautiful Soup, so rich and green, <br/> Waiting in a hot tureen! <br/> Who for such dainties would not stoop? <br/> Soup of the evening, beautiful Soup! ... </html>

В приведенном выше выводе мы видим, что в каждой строке есть один тег, а также что теги вложены друг в друга из-за схемы дерева, используемой Beautiful Soup.

Поиск экземпляров тега

Мы можем извлечь один тег со страницы, используя метод Beautiful Soup find_all. Это вернет все экземпляры данного тега в документе.

  1. soup.find_all('p')

Выполнение этого метода для нашего объекта возвращает полный текст песни вместе с соответствующими тегами <p> и любыми тегами, содержащимися в этом запрошенном теге, который здесь включает теги разрыва строки
:

Output
[<p class="verse" id="first">Beautiful Soup, so rich and green,<br/> Waiting in a hot tureen!<br/> Who for such dainties would not stoop?<br/> Soup of the evening, beautiful Soup!<br/> Soup of the evening, beautiful Soup!<br/></p>, <p class="chorus" id="second">Beau--ootiful Soo--oop!<br/> ... Beau--ootiful Soo--oop!<br/> Soo--oop of the e--e--evening,<br/> Beautiful, beauti--FUL SOUP!<br/></p>]

Вы заметите в приведенном выше выводе, что данные заключены в квадратные скобки [ ]. Это означает, что это тип данных списка Python.

Поскольку это список, мы можем вызвать определенный элемент в нем (например, третий элемент <p>) и использовать метод get_text() для извлечения всех текст внутри этого тега:

  1. soup.find_all('p')[2].get_text()

Вывод, который мы получим, будет тем, что находится в третьем элементе <p> в этом случае:

Output
'Beautiful Soup! Who cares for fish,\n Game or any other dish?\n Who would not give all else for two\n Pennyworth only of Beautiful Soup?\n Pennyworth only of beautiful Soup?'

Обратите внимание, что разрывы строк \n также отображаются в возвращаемой строке выше.

Поиск тегов по классу и идентификатору

Элементы HTML, которые ссылаются на селекторы CSS, такие как класс и идентификатор, могут быть полезны при работе с веб-данными с помощью Beautiful Soup. Мы можем ориентироваться на определенные классы и идентификаторы, используя метод find_all() и передавая строки класса и идентификатора в качестве аргументов.

Во-первых, давайте найдем все экземпляры класса chorus. В Beautiful Soup мы назначим строку класса ключевому аргументу class_:

  1. soup.find_all(class_='chorus')

Когда мы запустим приведенную выше строку, мы получим следующий список в качестве вывода:

Output
[<p class="chorus" id="second">Beau--ootiful Soo--oop!<br/> Beau--ootiful Soo--oop!<br/> Soo--oop of the e--e--evening,<br/> Beautiful, beautiful Soup!<br/></p>, <p class="chorus" id="fourth">Beau--ootiful Soo--oop!<br/> Beau--ootiful Soo--oop!<br/> Soo--oop of the e--e--evening,<br/> Beautiful, beauti--FUL SOUP!<br/></p>]

Два раздела с тегом <p> с классом chorus были выведены на терминал.

Мы также можем указать, что мы хотим искать класс chorus только внутри тегов <p>, если он используется более чем для одного тега:

  1. soup.find_all('p', class_='chorus')

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

Мы также можем использовать Beautiful Soup для таргетинга на идентификаторы, связанные с HTML-тегами. В этом случае мы назначим строку first ключевому аргументу id:

  1. soup.find_all(id='third')

Как только мы запустим строку выше, мы получим следующий вывод:

Output
[<p class="verse" id="third">Beautiful Soup! Who cares for fish,<br/> Game or any other dish?<br/> Who would not give all else for two<br/> Pennyworth only of Beautiful Soup?<br/> Pennyworth only of beautiful Soup?<br/></p>]

Текст, связанный с тегом <p> с идентификатором therth, выводится на терминал вместе с соответствующими тегами.

Заключение

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

Отсюда вы можете перейти к созданию программы парсинга веб-страниц, которая создаст файл CSV из данных, собранных из Интернета, следуя руководству How To Scrape Web Pages with Beautiful Soup и Python 3.