Парсер каталога товаров из HTML

Junior Python E-commerce

Условие задания

**Данные:** 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

Подсказки

Все тестовые задания →

Частые вопросы

Какой уровень знаний нужен для задачи "Парсер каталога товаров из HTML"?

Это задание для уровня Junior. Подходит для начинающих аналитиков, проверяет базовые знания SQL/Python/статистики.

На каких собеседованиях встречается такая задача?

Подобные задания в категории «Python» регулярно дают на собеседованиях аналитика данных в Яндекс, Сбер, Ozon, Авито, Тинькофф, Wildberries, T-Bank, X5, ВТБ и других крупных IT-компаниях. Тематика: python, beautifulsoup, парсинг, HTML, web scraping.

Сколько времени даётся на решение?

На реальном собеседовании на подобную задачу отводится 5-10 минут — проверяется скорость и базовая грамотность. Для тренировки рекомендуем сначала решить самостоятельно, потом сверить с эталонным решением и подсказками.

Где ещё потренироваться по теме «Python»?

На zasqlpython.ru есть 482 Python задачи с проверкой через Pyodide, конспекты Python и pandas, AI мок-собеседование с разбором ваших ответов.

← Все задания