0Pricing
AI Agents · Урок

Разбор HTML с помощью BeautifulSoup

find(), select(), селекторы CSS и извлечение структурированного содержимого из HTML.

«Разбор HTML с помощью BeautifulSoup» — бесплатный урок AI Agents на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения AI Agents, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс AI Agents содержит 4 уроков всего.

Зачем агентам разбирать HTML

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

BeautifulSoup (bs4) — стандартная библиотека Python для этой задачи. Она превращает неаккуратный HTML в объект Python, который легко запрашивать.

Создание объекта BeautifulSoup

Передайте необработанный HTML и имя анализатора в BeautifulSoup(). Анализатор 'html.parser' встроен в Python и не требует дополнительной установки. Для более быстрого разбора больших страниц можно установить 'lxml' через pip.

from bs4 import BeautifulSoup
import httpx

# Fetch HTML
response = httpx.get('https://example.com', timeout=10.0)
html = response.text

# Parse it
soup = BeautifulSoup(html, 'html.parser')

# Get the page title
print(soup.title.text)  # 'Example Domain'

find() — поиск одного элемента

soup.find(tag, attrs) возвращает первый подходящий элемент или None, если ничего не найдено. Можно выполнять поиск по имени тега, классу, идентификатору или любому attribute.

Всегда проверяйте наличие None, прежде чем вызывать методы для полученного результата.

from bs4 import BeautifulSoup

html = '<div class="content"><h1>Title</h1><p>Body text here.</p></div>'
soup = BeautifulSoup(html, 'html.parser')

# Find by tag + class
content_div = soup.find('div', class_='content')
if content_div:
    heading = content_div.find('h1')
    print(heading.text)  # 'Title'

# Find by id
sidebar = soup.find('div', id='sidebar')  # None if absent

find_all() — поиск нескольких элементов

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

from bs4 import BeautifulSoup

html = '<ul><li>Apple</li><li>Banana</li><li>Cherry</li></ul>'
soup = BeautifulSoup(html, 'html.parser')

items = soup.find_all('li')
for item in items:
    print(item.text)  # Apple, Banana, Cherry

# Limit results
first_two = soup.find_all('li', limit=2)

CSS-селекторы с помощью select()

soup.select('css selector') позволяет использовать привычный синтаксис CSS. Часто это короче, чем цепочка вызовов find(), особенно для вложенных элементов.

from bs4 import BeautifulSoup

html = '''
<table>
  <tr><td class="name">Alice</td><td class="score">95</td></tr>
  <tr><td class="name">Bob</td><td class="score">87</td></tr>
</table>
'''
soup = BeautifulSoup(html, 'html.parser')

# Select all td elements inside tr inside table
cells = soup.select('table tr td')
for cell in cells:
    print(cell.text)

# Select only name cells
names = soup.select('td.name')
for n in names:
    print(n.text)  # Alice, Bob

Извлечение текста с помощью .text и .strip()

.text (или .get_text()) возвращает всё текстовое содержимое внутри элемента, включая вложенные теги. Используйте .strip(), чтобы удалить начальные и конечные пробелы, которые часто встречаются в HTML.

from bs4 import BeautifulSoup

html = '<p>  \n  Price: <strong>$29.99</strong>  \n  </p>'
soup = BeautifulSoup(html, 'html.parser')

paragraph = soup.find('p')

# .text includes nested tag content
print(paragraph.text)          # '  \n  Price: $29.99  \n  '
print(paragraph.text.strip())  # 'Price: $29.99'

# get_text with separator
print(paragraph.get_text(separator=' ', strip=True))  # 'Price: $29.99'

Извлечение атрибутов с помощью .get()

К таким атрибутам тегов, как href, src и data-*, обращаются как к элементам словаря с помощью .get('attr_name'). Если attribute отсутствует, этот вызов безопасно возвращает None.

from bs4 import BeautifulSoup

html = '''
<a href="https://example.com/page" data-id="42">Click here</a>
<img src="/images/logo.png" alt="Logo">
'''
soup = BeautifulSoup(html, 'html.parser')

link = soup.find('a')
print(link.get('href'))     # 'https://example.com/page'
print(link.get('data-id'))  # '42'
print(link.get('class'))    # None (no class attribute)

img = soup.find('img')
print(img.get('src'))       # '/images/logo.png'

Навигация по дереву разбора

У элементов BeautifulSoup есть связи с родительскими, дочерними и соседними элементами, по которым можно перемещаться. Используйте .parent, .children, .next_sibling и .previous_sibling, чтобы перемещаться вокруг найденного элемента.

from bs4 import BeautifulSoup

html = '''
<div class="article">
  <h2>Headline</h2>
  <p>First paragraph.</p>
  <p>Second paragraph.</p>
</div>
'''
soup = BeautifulSoup(html, 'html.parser')

h2 = soup.find('h2')
print(h2.text)                    # 'Headline'
print(h2.parent['class'])         # ['article']
print(h2.next_sibling.next_sibling.text)  # 'First paragraph.'

Извлечение всех ссылок со страницы

Распространённая задача агента — собрать все ссылки со страницы для дальнейшего обхода. Найдите все теги <a> и извлеките их атрибуты href, отфильтровав пустые значения.

from bs4 import BeautifulSoup
import httpx

def extract_links(url: str) -> list:
    response = httpx.get(url, timeout=10.0)
    soup = BeautifulSoup(response.text, 'html.parser')

    links = []
    for tag in soup.find_all('a'):
        href = tag.get('href')
        if href and href.startswith('http'):
            links.append(href)
    return links

# urls = extract_links('https://news.ycombinator.com')
# print(urls[:5])

Корректная обработка некорректного HTML

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

from bs4 import BeautifulSoup

# Broken HTML — missing closing tags
html = '<div><p>Hello <strong>World</div>'
soup = BeautifulSoup(html, 'html.parser')

# BS4 repairs the tree automatically
print(soup.prettify())
# <div><p>Hello <strong>World</strong></p></div>

# Safe chained access
price = soup.find('span', class_='price')
price_text = price.text.strip() if price else 'N/A'
print(price_text)  # 'N/A'

Полный инструмент сбора данных для агента

Объединим всё: полная функция сбора данных, которую агент может вызывать как инструмент. Она получает страницу, разбирает её и возвращает структурированные данные в формате, пригодном для анализа агентом.

from bs4 import BeautifulSoup
import httpx

def scrape_article(url: str) -> dict:
    response = httpx.get(url, headers={'User-Agent': 'MyAgent/1.0'}, timeout=10.0)
    response.raise_for_status()
    soup = BeautifulSoup(response.text, 'html.parser')

    title = soup.find('h1')
    paragraphs = soup.find_all('p')

    return {
        'url': url,
        'title': title.text.strip() if title else '',
        'text': ' '.join(p.text.strip() for p in paragraphs[:5]),
        'links': [a.get('href') for a in soup.find_all('a', href=True)][:10]
    }

Проверка знаний: BeautifulSoup

Проверьте, насколько хорошо Вы понимаете разбор HTML с помощью BeautifulSoup.

Итоги: разбор HTML с помощью BeautifulSoup

Теперь Вы умеете извлекать структурированные данные из HTML-страниц внутри своих агентов:

  • Создавайте объект BeautifulSoup с помощью BeautifulSoup(html, 'html.parser')
  • Используйте find() для поиска одного элемента, а find_all() — нескольких
  • Используйте select() для запросов по селекторам CSS
  • Получайте текст с помощью .text.strip(), а атрибуты — с помощью .get('attr')
  • Перемещайтесь по дереву с помощью .parent, .children и соседних элементов

В сочетании с клиентом для веб-запросов BeautifulSoup позволяет Вашему агенту читать любую веб-страницу.

Часто задаваемые вопросы

Урок «Разбор HTML с помощью BeautifulSoup» бесплатный?

Да — полный текст урока «Разбор HTML с помощью BeautifulSoup» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс AI Agents, подпишись на CoddyKit PRO. Курс AI Agents содержит 4 уроков всего.

Чему я научусь в уроке «Разбор HTML с помощью BeautifulSoup»?

find(), select(), селекторы CSS и извлечение структурированного содержимого из HTML. Ты практикуешь AI Agents с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать AI Agents?

Предыдущий опыт не требуется. AI Agents на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.

Сколько времени занимает урок «Разбор HTML с помощью BeautifulSoup»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке AI Agents?

Да. Каждый урок AI Agents включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. HTTP-клиенты для агентов: httpx и requests
  2. Разбор HTML с помощью BeautifulSoup
  3. Обработка разбиения на страницы и динамического содержимого
  4. Корректные методы веб-скрейпинга
← Назад к AI Agents