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)