Что такое парсинг?
Парсинг (англ. parsing) — это процесс анализа и разбора структурированных данных, чаще всего в текстовом формате, с целью извлечения нужной информации или преобразования данных в более удобный для работы формат.
Парсинг широко используется в информационных технологиях и программировании для работы с различными типами данных, такими как текстовые документы, HTML-страницы, XML-файлы, JSON-данные и другие.
Примеры сфер, где применяется парсинг:
- Веб-скрапинг: Извлечение информации с веб-сайтов, такой как заголовки новостей, цены товаров, рейтинги и многое другое.
- Обработка HTML и XML: Анализ и извлечение данных из HTML-страниц и XML-документов.
- Обработка текстов: Разбор и анализ текстовых документов, таких как логи, журналы и др.
- Работа с данными форматов обмена: Парсинг и создание данных в форматах, таких как JSON, CSV, XML, YAML и другие.
- Анализ и обработка данных: Извлечение, преобразование и агрегирование данных для последующего анализа.
Для выполнения парсинга, часто используются специальные библиотеки и инструменты в языках программирования, такие как Python, Ruby, JavaScript и другие. Эти библиотеки облегчают процесс анализа данных и позволяют программистам эффективно извлекать и манипулировать информацией из различных источников.
Beautiful Soap
Beautiful Soup — это библиотека программирования на языке Python, которая помогает анализировать и извлекать данные из HTML и XML документов.
Она используется для «парсинга» веб-страниц и других текстовых документов, чтобы найти и извлечь нужную информацию.
Простыми словами, Beautiful Soup делает следующее:
- Скачивает веб-страницу: Она позволяет вам получить веб-страницу с интернета или загрузить уже существующий HTML-файл.
- Разбирает HTML или XML: Beautiful Soup анализирует структуру страницы, как если бы это было деревом с разными элементами, такими как заголовки, ссылки, текст и так далее.
- Извлекает данные: С помощью Beautiful Soup, вы можете легко найти и извлечь конкретные части информации с этой страницы. Например, заголовки новостей, цены товаров или ссылки на изображения.
- Облегчает работу с данными: Благодаря этой библиотеке, вы можете преобразовать сложный 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-элементам для определения их характеристик, поведения или внешнего вида. Атрибуты помогают уточнить, как должен вести себя или отображаться элемент на веб-странице. Атрибуты всегда указываются внутри открывающего тега элемента и обычно имеют вид имя="значение"
.
Вот несколько примеров атрибутов и их предназначения:
- Атрибут
src
(source):- Используется в теге
<img>
для указания пути к изображению, которое должно быть отображено на странице. - Пример:
<img src="image.jpg" alt="Описание изображения">
.
- Используется в теге
- Атрибут
href
(hypertext reference):- Используется в теге
<a>
для создания гиперссылок и указания URL-адреса, на который следует перейти при клике на ссылку. - Пример:
<a href="https://www.example.com">Ссылка на пример</a>
.
- Используется в теге
- Атрибут
class
:- Используется для присвоения одному или нескольким элементам одного класса, который может быть использован для применения стилей из таблицы стилей (CSS) или для выборки элементов с помощью JavaScript.
- Пример:
<div class="highlighted">Выделенный текст</div>
.
- Атрибут
id
:- Используется для уникальной идентификации элемента на странице. Каждый
id
должен быть уникальным в рамках всего документа. - Пример:
<p id="unique-paragraph">Уникальный абзац</p>
.
- Используется для уникальной идентификации элемента на странице. Каждый
- Атрибут
alt
(alternative text):- Используется в теге
<img>
для предоставления текстовой альтернативы изображению, которая будет отображаться в случае, если изображение не может быть загружено или доступно для некоторых пользователей (например, для пользователей с ограниченным зрением). - Пример:
<img src="image.jpg" alt="Описание изображения">
.
- Используется в теге
Разные элементы могут иметь различные атрибуты, и эти атрибуты используются для настройки элементов, делая веб-страницу более информативной и интерактивной.
Атрибуты class
и id
class
и id
— это атрибуты, которые могут быть присвоены HTML-элементам для определения их стиля и идентификации с помощью CSS (каскадных таблиц стилей) и JavaScript. Вот их более подробное описание:
class
(класс):class
— это атрибут, который присваивается одному или нескольким HTML-элементам с одним и тем же именем класса.- Он используется для применения одинакового стиля или форматирования к нескольким элементам.
- Несколько элементов могут иметь одинаковый
class
, что позволяет им совместно использовать общие стили. - В CSS вы можете выбрать элементы с определенным классом, используя селектор
.classname
.
Пример HTML с использованием class
:
<p class="highlight">Этот текст будет выделен</p>
<p class="highlight">Этот текст также будет выделен</p>
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)