Как работать с веб-данными, используя запросы и Beautiful Soup с Python 3

Вступление

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

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

Предпосылки

Чтобы завершить этот урок, вам понадобится среда разработки для Python 3. Вы можете следовать соответствующему руководству для вашей операционной системы, доступному в серии https://www.digitalocean.com/community/tutorial_series/how-to-install-and-set-up-a-local-programming-environment-for- python-3 [Как установить и настроить локальную среду программирования для Python 3] или https://www.digitalocean.com/community/tutorials/how-to-install-python-3-and-set-up-a -programming-environment-on-an-ubuntu-16-04-server [Как установить Python 3 и настроить среду программирования на сервере Ubuntu 16.04] для настройки всего, что вам нужно.

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

  • Https://www.digitalocean.com/community/tutorials/how-to-work-with-the-python-interactive-console[Python Interactive Console]

  • Importing Модули в Python 3

  • HTML структура и теги

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

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

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

. /bin/activate

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

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

pip install requests

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

OutputCollecting requests
 Downloading requests-2.18.1-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.18.1 urllib3-1.21.1

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

OutputRequirement already satisfied
...

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

Установка красивого супа

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

pip install beautifulsoup4

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

OutputCollecting beautifulsoup4
 Downloading beautifulsoup4-4.6.0-py3-none-any.whl (86kB)
   100% |████████████████████████████████| 92kB 4.4MB/s
Installing collected packages: beautifulsoup4
Successfully installed beautifulsoup4-4.6.0

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

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

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

Давайте сначала перейдем к Python Interactive Console:

python

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

import requests

Мы назначим URL-адрес (ниже) примера веб-страницы + mockturtle.html + для https://www.digitalocean.com/community/tutorials/how-to-use-variables-in-python-3. [переменная] + url +:

url = 'https://assets.digitalocean.com/articles/eng_python/beautiful-soup/mockturtle.html'

Затем мы можем присвоить результат запроса этой страницы переменной + page + с помощью http://docs.python-requests.org/en/master/user/quickstart/#make-a-request [` + request.get () + метод]. Мы передаем URL-адрес страницы (который был назначен переменной `+ url +) этому методу.

page = requests.get(url)

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

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

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

>>> page.status_code
200
>>>

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

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

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 создает дерево разбора из проанализированных документов HTML и XML (включая документы с незамкнутыми тегами или tag soup и другую искаженную разметку). Эта функциональность сделает текст веб-страницы более читабельным, чем то, что мы видели в модуле «Запросы».

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

from bs4 import BeautifulSoup

Далее, мы запустим документ + page.text + через модуль, чтобы дать нам объект + BeautifulSoup + - то есть дерево разбора с этой проанализированной страницы, которое мы получим при запуске встроенного в Python https: //docs.python.org/3/library/html.parser.html [+ html.parser +] поверх HTML. Созданный объект представляет документ + mockturtle.html + как вложенную структуру данных. Это присваивается переменной + soup +.

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

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

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 +. Это вернет все экземпляры данного тега в документе.

soup.find_all('p')

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

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 list.

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

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_ +:

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> +, если он используется более чем для одного тега:

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

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

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

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> + с идентификатором + third +, выводится на терминал вместе с соответствующими тегами.

Заключение

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

Отсюда вы можете приступить к созданию программы очистки веб-страниц, которая создаст файл CSV из данных, собранных из Интернета, следуя учебному руководству https://www.digitalocean.com/community/tutorials/how-to-scrape-. Веб-страницы с красивым супом и питоном [3].

Related