Проблема вывода данных с сайта с помощью BeautifulSoup

Я начинаю практиковаться в BeautifulSoup и попытался достать с сайта https://www.citilink.ru/catalog/shiny/ названия и цены шин. Вот мой код:

import requests
from bs4 import BeautifulSoup

url='https://www.citilink.ru/catalog/shiny/'
response = requests.get(url)
soup = BeautifulSoup(response.text, 'lxml')
items = soup.find_all('div', class_='product_data__gtm-js product_data__pageevents-js  ProductCardVertical js--ProductCardInListing ProductCardVertical_normal ProductCardVertical_shadow-hover ProductCardVertical_separated')
for  item in items:
    itemname = item.find('div', class_='ProductCardVertical__description ').text
    itemprice = item.find('span', class_='ProductPrice__price ProductCardVerticalPrice__price-current__price').text
    print(f'{itemname} и {itemprice}')

Вывод у программы пустой (ошибок нет). Все названия классов скопированы из кода сайта и с ними ошибка проблемы быть не должно. Подскажите пожалуйста, как получить нужные мне значения и что я сделал не так?


Ответы (1 шт):

Автор решения: Константин Николаевич Бояр II

Попробуйте вот такой вариант:

import requests
from bs4 import BeautifulSoup

url='https://www.citilink.ru/catalog/shiny/'
response = requests.get(url)
soup = BeautifulSoup(response.text, 'lxml')
items = soup.find_all('div', class_='product_data__gtm-js product_data__pageevents-js  ProductCardVertical js--ProductCardInListing ProductCardVertical_normal ProductCardVertical_shadow-hover ProductCardVertical_separated')

for  item in items:

    itemname = item.find('div', class_='ProductCardVerticalLayout__wrapper-description ProductCardVertical__layout-description').text
    
    itemprice = item.find('span', class_='ProductPrice ProductPrice_default ProductCardVerticalPrice__price-current').text

    print(f'{itemname} и {itemprice}')

Если это не поможет, то вам нужно будет использовать selenium что бы спарсить этот сайт

UPD:

Вот функция с тем же функционалом, но на селениуме

from selenium import webdriver
from selenium.webdriver.firefox.options import Options
from selenium.common.exceptions import NoSuchElementException
import time
from typing import List, Tuple, Union


def parse(url: str) -> List[Tuple[str, str, str]]:
    options = Options()
    options.add_argument('--headless')

    items = []
    driver = webdriver.Firefox(options=options)
    driver.implicitly_wait(0.5)
    
    while True:
        try:
            page = last_page = 1
            while page <= last_page:
                if page > 0:
                 url = f'https://www.citilink.ru/catalog/shiny/?p={page}'
            
            
            for item_el in driver.find_elements_by_css_selector("product_data__gtm-js product_data__pageevents-js  ProductCardVertical js--ProductCardInListing ProductCardVertical_normal ProductCardVertical_shadow-hover ProductCardVertical_separated"):
                

                try:
                    name = item_el.find_element_by_class_name('ProductCardVerticalLayout__wrapper-description ProductCardVertical__layout-description').text
                except NoSuchElementException:
                    name = ''

                try:
                    price = item_el.find_element_by_class_name('ProductPrice ProductPrice_default ProductCardVerticalPrice__price-current').text
                except NoSuchElementException:
                    price = '-'
                    
                row = name, price
                items.append(row)
            try:
               last_page = int(item_el.find_element_by_class_name('PaginationWidget__page js--PaginationWidget__page PaginationWidget__page_last PaginationWidget__page-link').text)
               page += 1   

            except NoSuchElementException:
                break
            
            
        finally:
            driver.quit()

    return items

if __name__ == '__main__':
    url = 'https://www.citilink.ru/catalog/shiny/?p=1'
    parse(url)
→ Ссылка