Keffmen
@Keffmen
Изучаю Python , C# , HTML и многое другое

Не могу понять почему Selenium не может найти class?

Вот код парсинга , мне нужно взять название , цену и картинку обоев !
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
import time



url = 'https://obnovi-oboi.ru/goods?category=oboi'
opts = Options()
#opts.add_argument("--headless")
browser = webdriver.Chrome(options=opts)

browser.get('https://obnovi-oboi.ru/goods?category=oboi')
html = browser.find_element(by=By.TAG_NAME, value='html')
for i in range(4):
    html.send_keys(Keys.PAGE_DOWN)
time.sleep(2)
xpath = '/html/body/main/section/div/div[2]/button'
browser.find_element(by=By.XPATH, value=xpath).click()

time.sleep(3)
container = browser.find_element(by=By.CLASS_NAME, value="row items")
oboi_items = container.find_element(By.CLASS_NAME, value="card good-item")#Тут уже  много что попробовал...


Ссылка на сайт в в коде , подскажите что делаю не так?
  • Вопрос задан
  • 838 просмотров
Решения вопроса 1
botermain
@botermain
Скажу сразу, мне не очень нравится код, поэтому вот несколько рекомендаций.

Наученный опытом, скажу, что использовать XPATH намного целесообразнее, но только не абсолютный указатель пути, а индексы, вот ссылка на документацию

Предлагаю организовать структуру поиска, немного иначе, вместо того, чтобы икать класс, в котором содержатся плитки, сразу искать их, это сэкономит время:
tabs = browser.find_elements(By.XPATH,'//div[@class="col-12 col-md-6 col-lg-4 col-xl-3"]') #Ищем все товарные плитки


Теперь, когда у нас есть список со всеми плитками, пройдемся по нему и подостаем все, что нам нужно:
for i in tabs:
    image = i.find_element(By.XPATH,'//img') #Достаем из плитки изображение
    name = i.find_element(By.XPATH,'//a[@class="card-title item_title sp-line-2"]') #Достаем из плитки название
    price = i.find_element(By.XPATH,'//div[@class="price"]') #Достаем из плитки цену
    print('Изображение: ',image.get_attribute('src'),' Название: ',name.text,' Цена: ',price.text) #Выводим всю информацию

Идея с отправкой кнопок для прокрутки, тоже не очень, лучше вместо этого запусти следующий скрипт, он автоматически прокрутит вниз на всю длину страницы:
browser.execute_script("window.scrollTo(0, document.body.scrollHeight);")


Вот полный скрипт для парсинга, который получился у меня, работает как часы, поэтому прошу к ознакомлению:
from webdriver_manager.chrome import ChromeDriverManager #Для пакетов Хромиума
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
import time


service_package = Service(ChromeDriverManager(log_level=0).install()) #Устанавливаю пакеты Хромиума

options = webdriver.ChromeOptions()
#options.add_argument('--headless')
driver = webdriver.Chrome(service=service_package,options=options)

driver.maximize_window() #Разворачиваем страницу, даже если в headless режиме, потому что не всё грузится

driver.get("https://obnovi-oboi.ru/goods?category=oboi")

driver.execute_script("window.scrollTo(0, document.body.scrollHeight);") # Скроллим до конца
time.sleep(2)

driver.find_element(By.XPATH,'/html/body/main/section/div/div[2]/button').click() # Кликаем кнопку
time.sleep(5)

driver.execute_script("window.scrollTo(0, document.body.scrollHeight);") # Скроллим до конца
time.sleep(2)

tabs = driver.find_elements(By.XPATH,'//div[@class="col-12 col-md-6 col-lg-4 col-xl-3"]') #Ищем все товарные плитки
for i in tabs:
    image = i.find_element(By.XPATH,'//img') #Достаем из плитки изображение
    name = i.find_element(By.XPATH,'//a[@class="card-title item_title sp-line-2"]') #Достаем из плитки название
    price = i.find_element(By.XPATH,'//div[@class="price"]') #Достаем из плитки цену
    print('Изображение: ',image.get_attribute('src'),' Название: ',name.text,' Цена: ',price.text) #Выводим всю информацию


Если будут ещё вопросы по поводу Selenium, обращайся !
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы