**Данные:** HTML-страница каталога интернет-магазина. Каждый товар — блок `<div class="product-card">` с вложенными элементами: название (`<h3>`), цена (`<span class="price">`), вес (`<span class="weight">`), ссылка (`<a href="...">`).
**Задание:**
1. Распарсите HTML-структуру каталога с помощью BeautifulSoup
2. Извлеките name, price (числом), weight (в кг), link для каждого товара
3. Соберите результат в DataFrame и отсортируйте по цене
Структура для ориентира — реальные значения из эталонного решения.
from bs4 import BeautifulSoup
import pandas as pd
import re
# Имитация HTML-каталога
html = """
<div class="catalog">
<div class="product-card">
<h3>Кофе молотый Арабика 250г</h3>
<span class="price">489 руб.</span>
<span class="weight">0.25 кг</span>
<a href="/product/coffee-arabica">Подробнее</a>
</div>
<div class="product-card">
<h3>Чай зелёный Сенча 100г</h3>
<span class="price">320 руб.</span>
<span class="weight">0.1 кг</span>
<a href="/product/tea-sencha">Подробнее</a>
</div>
<div class="product-card">
<h3>Какао-порошок 500г</h3>
<span class="price">650 руб.</span>
<span class="weight">0.5 кг</span>
<a href="/product/cacao-powder">Подробнее</a>
</div>
<div class="product-card">
<h3>Матча латте микс 200г</h3>
<span class="price">890 руб.</span>
<span class="weight">0.2 кг</span>
<a href="/product/matcha-latte">Подробнее</a>
</div>
<div class="product-card">
<h3>Цикорий растворимый 300г</h3>
<span class="price">210 руб.</span>
<span class="weight">0.3 кг</span>
<a href="/product/chicory">Подробнее</a>
</div>
</div>
"""
soup = BeautifulSoup(html, 'html.parser')
cards = soup.find_all('div', class_='product-card')
products = []
for card in cards:
name = card.find('h3').text.strip()
price_raw = card.find('span', class_='price').text.strip()
weight_raw = card.find('span', class_='weight').text.strip()
link = card.find('a')['href']
# Очистка числовых значений
price = float(re.sub(r'[^\d.]', '', price_raw.replace(',', '.')))
weight = float(re.sub(r'[^\d.]', '', weight_raw.replace(',', '.')))
products.append({
'name': name,
'price': price,
'weight_kg': weight,
'link': link,
})
df = pd.DataFrame(products)
df['price_per_kg'] = (df['price'] / df['weight_kg']).round(2)
df = df.sort_values('price', ascending=False).reset_index(drop=True)
print("Каталог товаров:")
print(df.to_string(index=False))
print(f"\nСредняя цена: {df['price'].mean():.0f} руб.")
print(f"Самый дорогой за кг: {df.loc[df['price_per_kg'].idxmax(), 'name']}")
python beautifulsoup парсинг HTML web scraping
Это задание для уровня Junior. Подходит для начинающих аналитиков, проверяет базовые знания SQL/Python/статистики.
Подобные задания в категории «Python» регулярно дают на собеседованиях аналитика данных в Яндекс, Сбер, Ozon, Авито, Тинькофф, Wildberries, T-Bank, X5, ВТБ и других крупных IT-компаниях. Тематика: python, beautifulsoup, парсинг, HTML, web scraping.
На реальном собеседовании на подобную задачу отводится 5-10 минут — проверяется скорость и базовая грамотность. Для тренировки рекомендуем сначала решить самостоятельно, потом сверить с эталонным решением и подсказками.
На zasqlpython.ru есть 482 Python задачи с проверкой через Pyodide, конспекты Python и pandas, AI мок-собеседование с разбором ваших ответов.
← Все задания