JavaRush /Курсы /Python SELF /Извлечение данных по HTML-тегам и атрибутам

Извлечение данных по HTML-тегам и атрибутам

Python SELF
31 уровень , 3 лекция
Открыта

1. Навигация по HTML-дереву

Сегодня мы погрузимся в таинственный мир HTML-деревьев и научимся извлекать информацию с веб-страниц как настоящие программистские ниндзя. Мы продолжим использовать волшебную библиотеку BeautifulSoup, чтобы добраться до нужных данных и украсить наши уже весьма умные скрипты еще большей функциональностью. Так что, смазывайте вашу клавиатуру, и начнем!

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

Вот так может выглядеть кусочек HTML:

HTML

<div class="article">
    <h2 id="title">Заголовок</h2>
    <p class="content">Это текст статьи...</p>
    <a href="https://example.com" class="link">Читать далее</a>
</div>

Здесь у нас есть div, который является родительским элементом для h2, p, и a. Каждый из них имеет свои атрибуты и содержимое.

2. Извлечение данных по тегам

BeautifulSoup предлагает удобные методы для навигации по дереву и извлечения данных. Начнем с базового метода find(), который позволит нам найти первый элемент с определенным тегом. А вот find_all() - это как поисковый бульдозер, который откапывает все элементы с заданным тегом.

python
                      
                        from bs4 import BeautifulSoup
                
                        html_doc = """<div class="article">
                                        <h2 id="title">Заголовок</h2>
                                        <p class="content">Это текст статьи...</p>
                                        <a href="https://example.com" class="link">Читать далее</a>
                                     </div>"""
                        
                        soup = BeautifulSoup(html_doc, 'html.parser')
                        
                        # Находим первый параграф
                        first_paragraph = soup.find('p')
                        print(first_paragraph.text)  # Вывод: Это текст статьи...
                        
                        # Находим все ссылки
                        all_links = soup.find_all('a')
                        for link in all_links:
                            print(link['href'])  # Вывод: https://example.com
                      
                    

3. Использование атрибутов для фильтрации элементов

Теперь, когда мы освоили поиск по тегам, пора узнать, как фильтровать элементы с использованием атрибутов, таких как id и class. Эти атрибуты — как закладки на странице, по которым сразу видно, что к чему.

HTML

<div class="article">
    <h2 id="title">Заголовок</h2>
    <p class="content">Это текст статьи...</p>
    <a href="https://example.com" class="link">Читать далее</a>
</div>
Python

# Находим элемент с определенным id
title = soup.find(id="title")
print(title.text)  # Вывод: Заголовок

# Находим все элементы с классом "content"
content_paragraphs = soup.find_all(class_="content")
for p in content_paragraphs:
    print(p.text)  # Вывод: Это текст статьи...

Важно! Мы используем class_ вместо class — это чтобы избежать конфликта с зарезервированным словом Python.

4. Практика извлечения данных с заданными условиями

А теперь приступим к практике! Представьте, что вам нужно извлечь ссылки и тексты заголовков из большого повторяющегося HTML-массива статей. Вот пример данных и как с ними работать:

HTML

<div class="articles">
    <div class="article">
        <h2 class="title">Первая статья</h2>
        <a href="https://example.com/1" class="read-more">Читать далее</a>
    </div>
    <div class="article">
        <h2 class="title">Вторая статья</h2>
        <a href="https://example.com/2" class="read-more">Читать далее</a>
    </div>
</div>

И вот как мы можем извлечь заголовки и ссылки:

Python

html_doc = """<div class="articles">
                <div class="article">
                    <h2 class="title">Первая статья</h2>
                    <a href="https://example.com/1" class="read-more">Читать далее</a>
                </div>
                <div class="article">
                    <h2 class="title">Вторая статья</h2>
                    <a href="https://example.com/2" class="read-more">Читать далее</a>
                </div>
              </div>"""

soup = BeautifulSoup(html_doc, 'html.parser')

articles = soup.find_all('div', class_='article')
for article in articles:
    title = article.find('h2', class_='title').text
    link = article.find('a', class_='read-more')['href']
    print(f"Заголовок: {title}, Ссылка: {link}")
    
# Вывод:
# Заголовок: Первая статья, Ссылка: https://example.com/1
# Заголовок: Вторая статья, Ссылка: https://example.com/2

5. О подводных камнях

Теперь, когда вы вооружены знаниями, давайте взглянем на некоторые типичные ошибки. Одна из самых распространенных проблем — это попытка доступа к атрибуту, которого не существует. Для этого Python отвечает дружелюбным, но все равно неприятным KeyError. Чтобы избежать этого, можно применять метод .get() для получения атрибутов с дефолтным значением, если они отсутствуют.

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

Следующей остановкой в нашем увлекательном путешествии станет применение CSS-селекторов, чтобы еще более точно целиться и извлекать информацию. Так что оставайтесь с нами, ведь приключения в мире BeautifulSoup только начинаются!

Комментарии (2)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Анатолий Уровень 63
16 февраля 2026
A Selenium будет дальше ?
Slevin Уровень 59
24 июля 2025
Знаете, как бы выглядела лекция по Пайтону, если бы её писала Дарья Донцова? Прочитайте эту лекцию Вообще, на этом уровне возникает стойкое ощущение, что я уже третий раз читаю одну и ту же лекцию с минимальными изменениями