Не могу правильно спарсить данные с сайта

Рейтинг: -1Ответов: 1Опубликовано: 30.07.2023
from bs4 import BeautifulSoup
from urllib import request, error
import ssl
from urllib.parse import quote
import time

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'
}


def parse_earrings(url):
    try:
        req = request.Request(url, headers=headers)
        with request.urlopen(req) as resp:
            data = resp.read()
            soup = BeautifulSoup(data, 'lxml')
            earrings = soup.find_all('span', itemprop='name')
            earrings_info = soup.find_all('div', class_='b-product_card__price-row')
            if not earrings or not earrings_info:
                print("На этой странице нет товаров.")
                return

            for name, info in zip(earrings, earrings_info):
                info = soup
                name = soup
                name_text = name.text.strip()
                price_value = info.find('span', class_='text-through')  # Цена от
                discount_value = info.find('span', class_='b-product_card__price-value')  # Цена со скидкой

                price_text = price_value.text.strip() if price_value else None
                discount_text = discount_value.text.strip() if discount_value else None

                result = f"{name_text} - Цена от: {price_text}{' Со скидкой: ' + discount_text if discount_text else ''}"

                print(result)

    except error.HTTPError as e:
        print(f"HTTP Error: {e}")
    except Exception as e:
        print(f"Error occurred: {e}")

def main():
    base_url = "https://epldiamond.ru/catalog/"
    ssl._create_default_https_context = ssl._create_unverified_context

    while True:
        category = input("Введите категорию (или 'выход' для завершения): ")
        if category.lower() == "выход":
            break
        elif category.lower() != "серьги":
            print("Некорректная категория. Пожалуйста, введите правильное название категории или 'выход' для завершения.")
            continue

        page_number = 1
        should_continue = True
        while should_continue:
            category_url = f"{base_url}{quote('diamond-earrings/')}?PAGEN_2={page_number}"
            time.sleep(2) 
            print(f"Парсинг страницы {page_number}...")
            parse_earrings(category_url)

            user_input = input("Введите 'далее' для перехода на следующую страницу или 'выход' для завершения: ")
            if user_input.lower() == "выход":
                break
            elif user_input.lower() != "далее":
                print("Некорректная команда, попробуйте снова.")
                continue

            page_number += 1

if __name__ == "__main__":
    main()

В основном когда писал код, пытался вывести в терминале вывод данных в нужном мне формате, и в один момент код просто перестал корректно работать, в терминале только 1 вывод и это:

Введите категорию (или 'выход' для завершения): Серьги
Парсинг страницы 1...
На этой странице нет товаров.
Введите 'далее' для перехода на следующую страницу или 'выход' для завершения:,

Ответы

▲ 0
import requests
from bs4 import BeautifulSoup


data = requests.get("https://epldiamond.kz/catalog/diamond-rings/")
if not data.ok:
    print('Упс')
    exit()

soup = BeautifulSoup(data.text.replace('Цена от:', ''), 'lxml')
for x in soup(class_="b-catalog-item"):
    name_text = x.find(itemprop='name').text.strip()
    price_text, *discount = x.find(class_="b-product-card__price-row").stripped_strings
    result = f"{name_text} - Цена от: {price_text} "
    if discount:
        result += ' '.join(discount[:-1])
    print(result)

Кольцо из белого золота с бриллиантом - Цена от: 1 271 200 ₸ 
Кольцо из белого золота с бриллиантами - Цена от: 2 196 900 ₸ Со скидкой: 834 822.00 ₸
...
Кольцо из желтого золота с бриллиантами - Цена от: 3 346 950 ₸ Со скидкой: 1 271 841.00 ₸
Кольцо из белого золота с бриллиантами - Цена от: 1 211 600 ₸ 
Кольцо из серебра с танзанитом - Цена от: 27 800 ₸