Проблема вывода данных с сайта с помощью 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)