Повторяет данные при парсинге сайта

Рейтинг: -1Ответов: 1Опубликовано: 03.07.2023

При парсинге сайта https://vkusnoitochka.ru/menu возникла проблема. В разделе "Новинки" нужно вывести название продукта, стоимость от, ссылку на фото продукта и дополнительную отметку (новинка). Всё правильно выводится, кроме Названия продукта. Вот как должно выглядеть:

Барселона Бургер от 239 ₽ https://vkusnoitochka.ru/resize/290x286/upload/iblock/aae/21412p8qq7npuh1ho5oklsbe3orwlyyo/large.png Новинка

Барселона Бургер с курицей от 215 ₽ https://vkusnoitochka.ru/resize/290x286/upload/iblock/aae/21412p8qq7npuh1ho5oklsbe3orwlyyo/large.png Новинка

Сырные треугольники Чоризо от 109 ₽ https://vkusnoitochka.ru/resize/290x286/upload/iblock/aae/21412p8qq7npuh1ho5oklsbe3orwlyyo/large.png Новинка

И т.д.

Но выводится:

Кидз Комбо обед с книжкой от 239 ₽ https://vkusnoitochka.ru/resize/290x286/upload/iblock/aae/21412p8qq7npuh1ho5oklsbe3orwlyyo/large.png Новинка

Кидз Комбо обед с книжкой от 215 ₽ https://vkusnoitochka.ru/resize/290x286/upload/iblock/aae/21412p8qq7npuh1ho5oklsbe3orwlyyo/large.png Новинка

Кидз Комбо обед с книжкой от 109 ₽ https://vkusnoitochka.ru/resize/290x286/upload/iblock/aae/21412p8qq7npuh1ho5oklsbe3orwlyyo/large.png Новинка

И т.д.

Буду очень благодарен если поможете с этой проблемой. Так же если несложно, мне нужно ещё помочь сохранить данные в csv или json файл. Пока что не сильно понимаю как это сделать.

Прикрепляю мой код:

import requests
from bs4 import BeautifulSoup
import csv

page = requests.get("https://vkusnoitochka.ru/menu")

soup = BeautifulSoup(page.text, "html.parser")

repos = soup.find('div', class_="page-catalog")

information = repos.find_all('div', class_="catalog-product__link-image")

for new in information:
    new_product = (new.text).strip()
    # print(new_product)

product_images = repos.find_all('img', class_="base-image__img")

for images in product_images:
    images_link = "https://vkusnoitochka.ru" + images.get('src')
    # print(images_link)

product_name = repos.find_all('div', class_="catalog-product-title")
for name in product_name:
    names = (name).text
    print(names)

# print(len(product_name))

items_cost = repos.find_all('p', class_="catalog-product__price")

for cost in items_cost:
    cost_of_item = (cost.text)
    cost_of_items = ' '.join(cost_of_item.split())
    # print(cost_of_items)
    
    print(f'{names} {cost_of_items} {images_link} {new_product}')

Ответы

▲ 0Принят
import json
import requests
from bs4 import BeautifulSoup

response = requests.get("https://vkusnoitochka.ru/menu")
soup = BeautifulSoup(response.text, "html.parser")
page = soup.find("div", class_="page-catalog")

# Извлекаем списки информации о товарах
infs = page.find_all("div", class_="catalog-product__link-image")
imgs = page.find_all("img", class_="base-image__img")
names = page.find_all("div", class_="catalog-product-title")
costs = page.find_all("p", class_="catalog-product__price")

# Генерируем список словарей, представляющих каждый товар
products_list = [{
    "id": i,
    "information": (info.text).strip(),
    "image": "https://vkusnoitochka.ru" + image.get("src"),
    "name": name.text,
    "price": " ".join((cost.text).split())
} for i, (info, image, name, cost) in enumerate(zip(infs, imgs, names, costs), 1)]

# Сохраняем список товаров в JSON-файл с отступами для удобного чтения
with open("products.json", "w", encoding="utf-8") as file:
    json.dump(products_list, file, ensure_ascii=False, indent=4)

JSON:

[
    {
        "id": 1,
        "information": "Новинка",
        "image": "https://vkusnoitochka.ru/resize/290x286/upload/iblock/300/byp3klrtathulxzi1bbeb3j3tw3ghd1w/large.png",
        "name": "Барселона Бургер",
        "price": "от 239 ₽"
    }
]