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 только начинаются!

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