Парсинг сайтов с помощью Beautiful Soup

Что такое парсинг?

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

Парсинг широко используется в информационных технологиях и программировании для работы с различными типами данных, такими как текстовые документы, HTML-страницы, XML-файлы, JSON-данные и другие.

Примеры сфер, где применяется парсинг:

  1. Веб-скрапинг: Извлечение информации с веб-сайтов, такой как заголовки новостей, цены товаров, рейтинги и многое другое.
  2. Обработка HTML и XML: Анализ и извлечение данных из HTML-страниц и XML-документов.
  3. Обработка текстов: Разбор и анализ текстовых документов, таких как логи, журналы и др.
  4. Работа с данными форматов обмена: Парсинг и создание данных в форматах, таких как JSON, CSV, XML, YAML и другие.
  5. Анализ и обработка данных: Извлечение, преобразование и агрегирование данных для последующего анализа.

Для выполнения парсинга, часто используются специальные библиотеки и инструменты в языках программирования, такие как Python, Ruby, JavaScript и другие. Эти библиотеки облегчают процесс анализа данных и позволяют программистам эффективно извлекать и манипулировать информацией из различных источников.

Beautiful Soap

Beautiful Soup — это библиотека программирования на языке Python, которая помогает анализировать и извлекать данные из HTML и XML документов.

Она используется для «парсинга» веб-страниц и других текстовых документов, чтобы найти и извлечь нужную информацию.

Простыми словами, Beautiful Soup делает следующее:

  1. Скачивает веб-страницу: Она позволяет вам получить веб-страницу с интернета или загрузить уже существующий HTML-файл.
  2. Разбирает HTML или XML: Beautiful Soup анализирует структуру страницы, как если бы это было деревом с разными элементами, такими как заголовки, ссылки, текст и так далее.
  3. Извлекает данные: С помощью Beautiful Soup, вы можете легко найти и извлечь конкретные части информации с этой страницы. Например, заголовки новостей, цены товаров или ссылки на изображения.
  4. Облегчает работу с данными: Благодаря этой библиотеке, вы можете преобразовать сложный HTML-код в удобный для работы формат, что позволяет вам анализировать и использовать данные в своих программных проектах.

Таким образом, Beautiful Soup — это мощный инструмент для извлечения информации с веб-страниц и других документов, который делает работу с веб-данными более доступной и удобной для программистов.

Начало работы с Beautiful Soap

Как установить Beautiful Soap

Сначала вам нужно установить Beautiful Soup с помощью pip (установщика пакетов Python). Откройте командную строку (терминал) и выполните следующую команду:

pip install beautifulsoup4

Эта команда загрузит и установит Beautiful Soup и его зависимости.

Подключаем Beautiful Soap к своему проекту

После установки Beautiful Soup, вы можете начать использовать его в своем проекте. Вам также потребуется библиотека requests, если вы планируете скачивать веб-страницы. Установите ее с помощью следующей команды:

pip install requests

Теперь вы можете импортировать Beautiful Soup и начать использовать его в своем коде Python. Вот пример кода для подключения Beautiful Soup и загрузки веб-страницы:

import requests
from bs4 import BeautifulSoup

# URL веб-страницы для парсинга
url = 'https://example.com'

# Отправка запроса к веб-странице
response = requests.get(url)

# Создание объекта Beautiful Soup для анализа HTML
soup = BeautifulSoup(response.text, 'html.parser')

# Теперь вы можете использовать объект 'soup' для парсинга и извлечения данных из HTML-страницы.

Из чего состоит веб-страница. HTML теги

Любая страница сайта представляет собой HTML документ.

HTML (Hypertext Markup Language) — это стандартный язык разметки, используемый для создания веб-страниц и определения их структуры и содержания. HTML-документ представляет собой текстовый файл, который браузер интерпретирует и отображает веб-страницу для пользователя.

HTML состоит из множества элементов, которые называются тегами.

Теги — это основные строительные блоки HTML-документа и выделяются угловыми скобками < >. Они имеют открывающий и закрывающий теги, которые обрамляют содержимое элемента. Например, <p> — это открывающий тег для абзаца, а </p> — закрывающий тег. Теги определяют тип и структуру элемента на странице.

Предназначение тегов зависит от их названия и роли. Например:

  • <html> — определяет начало и конец HTML-документа.
  • <head> — содержит метаданные и информацию о документе, такие как заголовок страницы, ссылки на стили и другие настройки.
  • <body> — содержит основное содержание страницы, такие как текст, изображения, ссылки и другие элементы, видимые для пользователя.
  • <p> — используется для создания абзацев текста.
  • <a> — создает гиперссылки на другие страницы или ресурсы.

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

Атрибуты HTML тегов

Атрибуты тегов (HTML attributes) — это дополнительные сведения или параметры, которые могут быть добавлены к HTML-элементам для определения их характеристик, поведения или внешнего вида. Атрибуты помогают уточнить, как должен вести себя или отображаться элемент на веб-странице. Атрибуты всегда указываются внутри открывающего тега элемента и обычно имеют вид имя="значение".

Вот несколько примеров атрибутов и их предназначения:

  1. Атрибут src (source):
    • Используется в теге <img> для указания пути к изображению, которое должно быть отображено на странице.
    • Пример: <img src="image.jpg" alt="Описание изображения">.
  2. Атрибут href (hypertext reference):
    • Используется в теге <a> для создания гиперссылок и указания URL-адреса, на который следует перейти при клике на ссылку.
    • Пример: <a href="https://www.example.com">Ссылка на пример</a>.
  3. Атрибут class:
    • Используется для присвоения одному или нескольким элементам одного класса, который может быть использован для применения стилей из таблицы стилей (CSS) или для выборки элементов с помощью JavaScript.
    • Пример: <div class="highlighted">Выделенный текст</div>.
  4. Атрибут id:
    • Используется для уникальной идентификации элемента на странице. Каждый id должен быть уникальным в рамках всего документа.
    • Пример: <p id="unique-paragraph">Уникальный абзац</p>.
  5. Атрибут alt (alternative text):
    • Используется в теге <img> для предоставления текстовой альтернативы изображению, которая будет отображаться в случае, если изображение не может быть загружено или доступно для некоторых пользователей (например, для пользователей с ограниченным зрением).
    • Пример: <img src="image.jpg" alt="Описание изображения">.

Разные элементы могут иметь различные атрибуты, и эти атрибуты используются для настройки элементов, делая веб-страницу более информативной и интерактивной.

Атрибуты class и id

class и id — это атрибуты, которые могут быть присвоены HTML-элементам для определения их стиля и идентификации с помощью CSS (каскадных таблиц стилей) и JavaScript. Вот их более подробное описание:

  1. class (класс):
    • class — это атрибут, который присваивается одному или нескольким HTML-элементам с одним и тем же именем класса.
    • Он используется для применения одинакового стиля или форматирования к нескольким элементам.
    • Несколько элементов могут иметь одинаковый class, что позволяет им совместно использовать общие стили.
    • В CSS вы можете выбрать элементы с определенным классом, используя селектор .classname.

Пример HTML с использованием class:

<p class="highlight">Этот текст будет выделен</p>
<p class="highlight">Этот текст также будет выделен</p>
  1. id (идентификатор):
    • id — это атрибут, который присваивается уникальному HTML-элементу на странице.
    • Каждый id должен быть уникальным на всей веб-странице; в противном случае это будет недопустимо.
    • id обычно используется для идентификации конкретного элемента и применения к нему уникальных стилей или для взаимодействия с элементом с помощью JavaScript.
    • В CSS вы можете выбрать элемент с определенным id, используя селектор #idname.

Пример HTML с использованием id:

<div id="unique-element">Этот элемент уникален и его можно идентифицировать по id</div>

Использование class и id позволяет разработчикам более точно управлять структурой и стилями веб-страницы, а также обеспечивает уникальную идентификацию элементов для взаимодействия с ними через скрипты.

Получение и поиск необходимых элементов

 

Практическое применение Beautiful Soup

Задача. Дана статья. Получить все заголовки статьи h1-h4. И на основании нее вывести многоуровневый список со структурой данной статьи.

import requests
from bs4 import BeautifulSoup

# URL веб-страницы для парсинга
url = 'https://habr.com/ru/articles/764440/'

# Отправка GET-запроса к веб-странице и получение HTML-кода
response = requests.get(url)

# Проверка успешности запроса
if response.status_code == 200:
    # Создание объекта Beautiful Soup для анализа HTML
    soup = BeautifulSoup(response.text, 'html.parser')

    # Находим все заголовки h1-h4 на странице
    headers = soup.find_all(['h1', 'h2', 'h3', 'h4'])

    # Инициализируем многоуровневый список
    nested_list = []

    # Проходимся по найденным заголовкам
    for header in headers:
        # Получаем текст заголовка
        header_text = header.text.strip()
        
        # Определяем уровень заголовка
        header_level = int(header.name[1])  # Получаем цифру из имени тега (например, 1 из "h1")
        
        # Создаем элемент списка для текущего заголовка
        current_item = {'text': header_text, 'children': []}
        
        # Добавляем элемент в нужный уровень списка
        parent = nested_list
        for _ in range(header_level - 1):
            parent = parent[-1]['children']
        parent.append(current_item)

    # Функция для рекурсивного построения HTML-списка
    def build_html_list(items):
        result = "<ul>"
        for item in items:
            result += f"<li>{item['text']}"
            if item['children']:
                result += build_html_list(item['children'])
            result += "</li>"
        result += "</ul>"
        return result

    # Строим HTML-список на основе структуры
    html_list = build_html_list(nested_list)

    # Выводим HTML-список
    print(html_list)

else:
    print("Не удалось получить страницу. Код ответа:", response.status_code)

Этот код отправляет GET-запрос к указанной странице, а затем, если запрос прошел успешно (код ответа 200), использует Beautiful Soup для поиска всех заголовков h1-h4 на странице. Затем код строит многоуровневый список на основе структуры заголовков и преобразует его в HTML-список с вложенными элементами <ul> и <li>. Рекурсивная функция build_html_list используется для построения HTML-списка.

После выполнения этого кода, вы получите многоуровневый список, отражающий структуру заголовков h1-h4 на странице.

Усовершенствуем пример. Добавим в результат не только заголовки, но и контент в тегах <p> после заголовков.

import requests
from bs4 import BeautifulSoup

# URL веб-страницы для парсинга
url = 'https://habr.com/ru/articles/764440/'

# Отправка GET-запроса к веб-странице и получение HTML-кода
response = requests.get(url)

# Проверка успешности запроса
if response.status_code == 200:
    # Создание объекта Beautiful Soup для анализа HTML
    soup = BeautifulSoup(response.text, 'html.parser')

    # Находим div с id="post-content-body"
    content_div = soup.find('div', {'id': 'post-content-body'})

    if content_div:
        # Инициализируем многоуровневый список
        nested_list = []

        # Находим все элементы внутри div с id="post-content-body"
        elements = content_div.find_all()

        current_item = None

        # Проходимся по найденным элементам
        for element in elements:
            # Если элемент - заголовок h1-h4
            if element.name and element.name.startswith('h') and element.name!='hr':
                # Получаем текст заголовка
                header_text = element.text.strip()
                print (element.name)
                # Определяем уровень заголовка
                header_level = int(element.name[1])  # Получаем цифру из имени тега (например, 1 из "h1")

                # Находим все теги <p> после заголовка и объединяем их в контент
                content_paragraphs = []
                next_sibling = element.find_next_sibling()
                while next_sibling and next_sibling.name == 'p':
                    content_paragraphs.append(next_sibling.text.strip())
                    next_sibling = next_sibling.find_next_sibling()

                # Создаем элемент списка для текущего заголовка
                current_item = {'text': header_text, 'content': ' '.join(content_paragraphs), 'children': []}

                # Добавляем элемент в нужный уровень списка
                parent = nested_list
                for _ in range(header_level - 1):
                    if parent:
                        parent = parent[-1]['children']
                parent.append(current_item)
            elif current_item is not None:
                # Если текущий элемент - не заголовок, добавляем его в "content" предыдущего элемента
                current_item['content'] += str(element)

        # Функция для рекурсивного построения HTML-списка
        def build_html_list(items):
            result = "<ul>"
            for item in items:
                result += f"<li>{item['text']} <p>{item['content']}</p>"
                if item['children']:
                    result += build_html_list(item['children'])
                result += "</li>"
            result += "</ul>"
            return result

        # Строим HTML-список на основе структуры
        html_list = build_html_list(nested_list)

        # Выводим HTML-список
        print(html_list)

    else:
        print("Не удалось найти div с id='post-content-body' на странице.")

else:
    print("Не удалось получить страницу. Код ответа:", response.status_code)

 

 

Понравилась статья? Поделиться с друзьями:
Школа Виктора Комлева
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!:

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.