Работа с веб-данными с помощью Requests и Beautiful Soup в Python 3

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

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

Требования

Вам понадобится среда разработки Python 3. Чтобы создать такую среду, можно воспользоваться руководствами Настройка локальной среды разработки для Python 3 в Ubuntu 16.04 или Установка Python 3 и настройка среды разработки на сервере Ubuntu 16.04.

Также рекомендуем ознакомиться со следующими статьями:

Кроме того, вам нужно иметь базовые знания о структурах и тегах HTML.

Установка Requests

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

. my_env/bin/activate

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

Установите Requests в среду программирования.

pip install requests
Collecting 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 была установлена ранее, вы получите такой вывод:

Requirement already satisfied
...

Установка Beautiful Soup

Теперь нужно установить Beautiful Soup с помощью pip. На данный момент последней версией является Beautiful Soup 4.

pip install beautifulsoup4

Команда выведет:

Collecting 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

Теперь можно приступать к работе с библиотеками.

Сбор данных веб-страницы с помощью Requests

С помощью этих двух библиотек Python, можно проанализировать веб-страницу.

Перейдите в Python Interactive Console:

python

Читайте также: Использование интерактивной консоли Python

Импортируйте модуль Requests, чтобы собрать данные с веб-страницы:

import requests

Присвойте URL-адрес тестовой страницы (в данном случае это mockturtle.html) переменной url.

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

Затем можно присвоить результат запроса этой страницы переменной page с помощью метода 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 по этой ссылке.

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

page.text

Нажмите Enter.

'<!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 и неправильной разметкой). Эта библиотека сделает текст веб-страницы, извлеченный с помощью Requests, более удобочитаемым.

Импортируйте Beautiful Soup в консоль Python.

from bs4 import BeautifulSoup

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

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

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

print(soup.prettify())
<!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.

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

Извлечь один тег со страницы можно с помощью метода find_all. Он вернет все экземпляры данного тега в документе.

soup.find_all('p')

Применив этот метод, вы получите полный текст с соответствующими тегами <p> и любыми тегами, содержащимися в этом запрошенном теге (например, тег <br/>).

[<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 называется списками.

Читайте также: Работа со списками в Python 3

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

soup.find_all('p')[2].get_text()
'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 также показаны в возвращаемой строке.

Поиск тегов по классам и ID

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

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

soup.find_all(class_='chorus')
Запустите эту строку, и вы увидите:
[<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')
[<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, выводится в терминал вместе с соответствующими тегами.

Заключение

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

Tags: , ,