Найти тему
Linux code

Библиотека beautifulsoup и Бах

Beautiful Soup - это библиотека Python для извлечения данных из HTML и XML.

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

В Ubuntu библиотека устанавливается с помощью команды:

sudo apt-get install python3-bs4

Попробуем извлечь из wiki список произведений Иоганна Себастьяна Баха
Импорт необходимых модулей:

import requests

from bs4 import BeautifulSoup, Tag, NavigableString


Для начала необходимо получить HTML данные с помощью модуля
requests, который позволяет отправлять запросы HTTP. Запрос возвращает объект ответа со всеми данными ответа (содержимое, кодировка, состояние и т.д.)

def get_html(url):
try:
response = requests.get(url)
except requests.Timeout:
print("GET_HTML: Ошибка timeout, url: " + url)
return "Error"
except requests.HTTPError as error:
print("GET_HTML: Ошибка url (0), код: (1)".format(url, code))
return "Error"
except requests.RequestException:
print("GET_HTML: Ошибка скачивания " + url)
return "Error"
else:
return response.text


Следующая функция возвращает объект
BeautifulSoup

def get_parse_data(html):
parser = BeautifulSoup(html, 'html.parser')
return parser

Выводить обработанные данные будем в консоли

def print_wikipedia_string(it, space, text):
string = text.replace("\n", "").replace("\"", "")
string = (it * space) + string
print(string)

def print_wikipedia_list(it, space, ul):
for li in ul.findAll('li', recursive=False):
if len(li.findAll('ul')) > 0:
for item in li.contents:
if item.name == "ul":
print_wikipedia_list(it + 1, space, item)
else:
if isinstance(item, NavigableString):
print_wikipedia_string(it, space, item)
elif isinstance(item, Tag):
print_wikipedia_string(it, space, item.text)
else:
print_wikipedia_string(it, space, li.text)

После получения объекта BeautifulSoup, можно сделать анализ HTML

def parse_wikipedia_page(url):
space = " "
it = 0

html = get_html(url)
if html != "Error":
data = get_parse_data(html).find("div", { "class" : "mw-parser-output" })
array = data.findAll(True, recursive=False)

for index in array:
if index.name == "h2":
print("\n" + index.find("span", { "class" : "mw-headline" }).text)
elif index.name == "ul":
print_wikipedia_list(it + 1, space, index)

Описание кода: функция get_html получает делает запрос и получает HTML, функция get_parse_data получает объект BeautifulSoup, .find - находит объект с классом "mw-parser-output". Массив "array" заполняем дочерними элементами, с помощью функции findAll. Во время перебора элементов массива функция выводит заголовок или список(print_wikipedia_list)

Осталось вызвать функцию:

url = "https://ru.wikipedia.org/wiki/список_произведений_Иоганна_Себастьяна_Баха"
parse_wikipedia_page(url)