Разбор HTML с помощью BeautifulSoup
Перемещайтесь по дереву разбора и извлекайте данные с помощью селекторов.
«Разбор HTML с помощью BeautifulSoup» — бесплатный урок Python Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Python Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Python Academy содержит 4 уроков всего.
Установка BeautifulSoup
beautifulsoup4 разбирает HTML и XML. Используйте парсер lxml для большей скорости или html.parser, если не хотите устанавливать дополнительные зависимости.
# pip install beautifulsoup4 lxml
from bs4 import BeautifulSoup
html = "<h1>Hello</h1><p class='intro'>World</p>"
soup = BeautifulSoup(html, "lxml")
print(soup.h1.text) # HelloПоиск элементов
find(tag) возвращает первый подходящий элемент. find_all(tag) возвращает список всех подходящих элементов.
from bs4 import BeautifulSoup
html = "<ul><li>A</li><li>B</li><li>C</li></ul>"
soup = BeautifulSoup(html, "lxml")
print(soup.find("li").text) # A
print([li.text for li in soup.find_all("li")]) # [A,B,C]CSS-селекторы
soup.select("css selector") использует синтаксис CSS. soup.select_one() возвращает первое совпадение.
from bs4 import BeautifulSoup
html = '<div class="card"><a href="/p/1">Link 1</a></div>'
soup = BeautifulSoup(html, "lxml")
print(soup.select("div.card a")[0]["href"]) # /p/1
print(soup.select_one("a")["href"]) # /p/1Доступ к атрибутам
Обращайтесь к атрибутам тега как к элементам словаря: tag["href"], tag.get("class", []).
from bs4 import BeautifulSoup
html = '<a href="https://example.com" class="link external">Click</a>'
soup = BeautifulSoup(html, "lxml")
a = soup.find("a")
print(a["href"]) # https://example.com
print(a.get("class", [])) # ['link', 'external']Навигация по дереву разбора
Используйте .parent, .children, .next_sibling и .previous_sibling, чтобы перемещаться по дереву.
from bs4 import BeautifulSoup
html = "<div><h2>Title</h2><p>Para</p></div>"
soup = BeautifulSoup(html, "lxml")
h2 = soup.find("h2")
print(h2.parent.name) # div
print(h2.next_sibling.text) # Para (next sibling)Извлечение текста
tag.get_text(separator=" ", strip=True) возвращает весь текст внутри тега, очищая лишние пробелы.
from bs4 import BeautifulSoup
html = "<div> <p>Hello</p> <p> World </p> </div>"
soup = BeautifulSoup(html, "lxml")
print(soup.div.get_text(separator=" ", strip=True))
# Hello WorldПарсинг с requests и BeautifulSoup
Получите страницу с помощью requests и разберите её с помощью BeautifulSoup — это классическое сочетание для парсинга.
import requests
from bs4 import BeautifulSoup
url = "https://books.toscrape.com"
r = requests.get(url, timeout=10)
soup = BeautifulSoup(r.text, "lxml")
titles = [h3.find("a")["title"] for h3 in soup.select("article.product_pod h3")]
print(titles[:3])Обработка относительных URL
Используйте urllib.parse.urljoin(base, href), чтобы преобразовать относительные ссылки в абсолютные URL.
from urllib.parse import urljoin
base = "https://example.com/products/"
href = "../about"
print(urljoin(base, href)) # https://example.com/aboutОбработка кодировок
BeautifulSoup автоматически определяет кодировку, но её можно указать явно или получить с помощью r.encoding из requests.
import requests
from bs4 import BeautifulSoup
r = requests.get("https://example.com")
print(r.encoding) # e.g. utf-8
soup = BeautifulSoup(r.content, "lxml", from_encoding=r.encoding)Изменение и сериализация
Изменяйте дерево разбора и преобразуйте его обратно в HTML с помощью str(tag) или soup.prettify().
from bs4 import BeautifulSoup
html = "<p>Hello <b>world</b></p>"
soup = BeautifulSoup(html, "lxml")
soup.b.decompose() # remove the <b> tag
print(str(soup.p)) # <p>Hello </p>Ограничения BeautifulSoup
BS4 разбирает статический HTML, но не может выполнять JavaScript. Для страниц, содержимое которых формируется с помощью JS, используйте Playwright или Selenium.
# BeautifulSoup: good for static HTML
# Playwright: for JavaScript-rendered SPAs
# Scrapy: for large-scale crawls with pipelines
# pip install playwright
# playwright install
# from playwright.async_api import async_playwrightБыстрая проверка
Какой метод возвращает все элементы, соответствующие CSS-селектору, в BeautifulSoup?
Итоги
BeautifulSoup преобразует HTML в дерево, по которому можно перемещаться. Используйте find()/find_all() для поиска тегов, select() для CSS-селекторов и get_text() для получения очищенного текста. Для статических страниц объединяйте BeautifulSoup с requests, а для содержимого, формируемого с помощью JS, используйте Playwright.
Часто задаваемые вопросы
Урок «Разбор HTML с помощью BeautifulSoup» бесплатный?
Да — полный текст урока «Разбор HTML с помощью BeautifulSoup» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Python Academy, подпишись на CoddyKit PRO. Курс Python Academy содержит 4 уроков всего.
Чему я научусь в уроке «Разбор HTML с помощью BeautifulSoup»?
Перемещайтесь по дереву разбора и извлекайте данные с помощью селекторов. Ты практикуешь Python Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Python Academy?
Предыдущий опыт не требуется. Python Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.
Сколько времени занимает урок «Разбор HTML с помощью BeautifulSoup»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Python Academy?
Да. Каждый урок Python Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- HTTP-запросы с requests и httpx
- Разбор HTML с помощью BeautifulSoup
- Создание паука Scrapy
- Обработка JavaScript и мер против парсинга