Selenium не может найти элементы по имени класса - PullRequest
2 голосов
/ 21 июня 2020

Я пытаюсь получить список цен на этой странице .

Имя класса элементов, которые я пытаюсь получить, называется s-item__price . Это мой код:

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

url = 'https://www.ebay.de/sch/i.html?_from=R40&_nkw=iphone+8+&_sacat=0&LH_TitleDesc=0&LH_ItemCondition=3000&rt=nc&LH_Sold=1&LH_Complete=1'

chrome_options = Options()
chrome_options.add_argument('--headless')

browser = webdriver.Chrome(options=chrome_options)

browser.get(url)

print(browser.find_elements_by_class_name('s-item__price'))

browser.quit()

Результатом является пустой список.

Ответы [ 2 ]

1 голос
/ 21 июня 2020

Вы можете использовать WebDriverWait, чтобы дождаться, пока javascript сгенерирует элемент:

wait = WebDriverWait(browser, 15) # 15 sec timeout
wait.until(expected_conditions.visibility_of_element_located((By.CLASS_NAME, 's-item__price')))

Вы также можете использовать presence_of_elements_located, но если дело доходит до взаимодействия с щелчком, он не будет работать со скрытыми элементами. Так что лучше использовать: visibility_of_element_located

Пример кода:

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions

url = 'https://www.ebay.de/sch/i.html?_from=R40&_nkw=iphone+8+&_sacat=0&LH_TitleDesc=0&LH_ItemCondition=3000&rt=nc&LH_Sold=1&LH_Complete=1'

options = Options()
options.add_argument('--headless')

browser = webdriver.Chrome(options=options)
browser.get(url)

wait = WebDriverWait(browser, 15) # Throws a TimeoutException after 15 seconds
wait.until(expected_conditions.visibility_of_element_located((By.CLASS_NAME, 's-item__price')))
# you may also culd use the return value of the wait

print(browser.find_elements_by_class_name('s-item__price'))
browser.quit()
0 голосов
/ 22 июня 2020

Вы получаете пустой список, я думаю, это потому, что вам нужно подождать.

Используйте WebDriverWait и используйте .presence_of_all_elements_located для сбора элементов в списке.

Затем извлеките их с помощью al oop, и вы должны вызвать метод .text, чтобы получить текст

browser.get('https://www.ebay.de/sch/i.html?_from=R40&_nkw=iphone%208%20&_sacat=0&LH_TitleDesc=0&LH_ItemCondition=3000&rt=nc&LH_Sold=1&LH_Complete=1')
wait = WebDriverWait(browser, 20)
list_price = wait.until(EC.presence_of_all_elements_located((By.CLASS_NAME, 's-item__price')))
for price in list_price:
    print(price.text)
driver.quit()

После импорта:

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
...