CoderCastrov logo
CoderCastrov
Парсер

Использование Beautiful Soup 4 для автоматического создания HTML оглавления

Использование Beautiful Soup 4 для автоматического создания HTML оглавления
просмотров
3 мин чтение
#Парсер

Beautiful Soup 4 - известный пакет для навигации внутри структур данных HTML или XML. Его простота позволяет сэкономить массу времени. Здесь мы будем использовать Beautiful Soup 4 для создания HTML оглавления всего за несколько строк кода.

Это поможет нам быстро получить общее представление о содержании статьи, и мы даже сможем использовать этот код для дальнейшего улучшения и проверки структуры наших заголовков hn с точки зрения SEO. Давайте начнем прямо сейчас.

Если у вас еще не установлен Beautiful Soup 4, вы можете найти процесс установки здесь: https://www.crummy.com/software/BeautifulSoup/bs4/doc/#installing-beautiful-soup

Инициализация Beautiful Soup 4

Прежде всего, нам нужны некоторые входные данные. Beautiful Soup 4 предназначен для парсинга HTML и XML, поэтому давайте получим HTML-страницу: https://en.wikipedia.org/wiki/Machine_learning

Мы начнем с импорта всех необходимых пакетов и получения страницы.

import re # Нам понадобится использовать регулярные выражения позже
import requests
from bs4 import BeautifulSoupwiki_page = requests.get("[https://en.wikipedia.org/wiki/Machine_learning](https://en.wikipedia.org/wiki/Machine_learning)")

Теперь, когда у нас есть страница, нам нужно инициализировать Beautiful Soup с помощью этой строки кода.

soup = BeautifulSoup(wiki_page.content, 'html.parser')

Поиск данных в HTML-структуре

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

Основной заголовок можно найти, ища тег title. Beautiful Soup 4 очень прост в использовании. Мы можем найти тег title с помощью метода find, довольно просто. Затем мы поместим найденные данные с именем тега и его текстом в массив для последующего использования.

title_node = soup.find("title")
tile_data = [title_node.name, title_node.get_text()]

Теперь нам остается найти все остальные заголовки на странице. Если страница хорошо структурирована, все заголовки будут находиться в тегах hn. Теги hn - это теги h1, h2, h3 и так далее. Теги hn редко превышают 4-й уровень. Следовательно, мы можем взять только теги, имеющие только 1 цифру после "h". Регулярные выражения удобны для этого, и их также можно использовать с Beautiful Soup.

hns = soup.find_all(re.compile("h[0-9]{1}"))

Теперь у нас есть наши теги hn. Нам нужно немного их очистить и структурировать. Для каждого тега hn мы возьмем только первый текстовый элемент тега, потому что мы заметили, что наши данные содержат некоторые ссылки на "edit", которые нам нужно удалить.

hn_structure = []
for hn in hns:
    hn_text_content = [x for x in hn.stripped_strings if x is not None]
    if len(hn_text_content) > 0:
        hn_structure.append([hn.name, hn_text_content[0]])

Наконец, мы хотим преобразовать эти данные в формат HTML. Простой цикл справится с этим заданием.

tag_template = "<{tag_name}>{content}</{tag_name}>\n"
html_output = "<html>\n"
html_output += tag_template.format(tag_name = tile_data[0], content = tile_data[1])
for hn in hn_structure:
    html_output += tag_template.format(tag_name = hn[0], content = hn[1])
html_output += "</html>"

Вот и все, вы можете найти данные HTML в переменной html_output. Таким образом, мы показали, что очень легко получить данные из HTML или XML-структуры с помощью Beautiful Soup 4. Исходя из этой отправной точки, мы можем либо добавить немного стиля в ваше HTML-оглавление, чтобы создать замечательное визуальное оглавление, либо пойти по пути SEO и использовать данные тегов hn для проверки структуры hn.


Если вам понравилась статья или она оказалась полезной, будьте добры поддержать меня, следуя за мной здесь (Jonathan Mondaut). Скоро появятся еще статьи!


Ниже приведен полный код для использования:

import re # Нам понадобится использовать регулярные выражения позже
import requests
from bs4 import BeautifulSoupwiki_page = requests.get("[https://en.wikipedia.org/wiki/Machine_learning](https://en.wikipedia.org/wiki/Machine_learning)")soup = BeautifulSoup(wiki_page.content, 'html.parser')title_node = soup.find("title")
tile_data = [title_node.name, title_node.get_text()]hns = soup.find_all(re.compile("h[0-9]{1}"))
hn_structure = []
for hn in hns:
    hn_text_content = [x for x in hn.stripped_strings if x is not None]
    if len(hn_text_content) > 0:
        hn_structure.append([hn.name, hn_text_content[0]])tag_template = "<{tag_name}>{content}</{tag_name}>\n"
html_output = "<html>\n"
html_output += tag_template.format(tag_name = tile_data[0], content = tile_data[1])
for hn in hn_structure:
    html_output += tag_template.format(tag_name = hn[0], content = hn[1])
html_output += "</html>"