Объект Selenium ‘list’ не имеет атрибута ‘text’

#python #selenium #selenium-webdriver #xpath

#питон #селен #selenium-веб-драйвер #xpath

Вопрос:

Поэтому я использую python и selenium, чтобы очистить названия продуктов на странице sephora.

 url = 'https://www.sephora.com/ca/en/shop/face-makeup'

driver.get(url)  
time.sleep(2)
   
browser = scrollDown(driver, 20)

# this selected the div for every product on the page
products = driver.find_elements_by_class_name('css-79elbk')

for product in products:
    title = product.find_elements_by_xpath('/html/body/div[1]/div[2]/div/div/div/div[2]/div[1]/main/div[3]/div/div[1]/div[1]/div[1]/a/div/div[4]/span[2]').text
    print(title)
 

Проблема в том , что когда я запускаю его , я получаю Line 48: AttributeError: 'list' object has no attribute 'text' . Заголовок находится в интервале, который вложен в div. Я пробовал это на обычном div с текстом внутри, и он очищает его без проблем.

Комментарии:

1. Обратите внимание, что используемая вами функция находит элементы s по xpath (обратите внимание на «s» в find_elements_by_xpath ). Функция возвращает список, а не отдельный объект.

2. @ShaneBishop, который избавился от ошибки, о которой я упоминал, но теперь он просто возвращает первую цену товара x количество товаров на странице.

Ответ №1:

Ошибка появляется из-за того, что эта строка:

 .find_elements_by_xpath('/html/body/div[1]/div[2]/div/div/div/div[2]/div[1]/main/div[3]/div/div[1]/div[1]/div[1]/a/div/div[4]/span[2]').text
 

Приведенное выше возвращает список.

.text метод использует to .find_element_* (без s)

Но в simple вы можете очистить заголовок с помощью css-селектора с этим значением : div[data-comp="ProductDisplayName "] span[data-at="sku_item_name"]

Попробуйте выполнить следующий код:

 url = 'https://www.sephora.com/ca/en/shop/face-makeup'

driver.get(url)  
time.sleep(2)
   
browser = scrollDown(driver, 20)

titles = driver.find_elements_by_css_selector('div[data-comp="ProductDisplayName "] span[data-at="sku_item_name"]')
for title in titles:
    print(title.text)
 

Чтобы очистить бренд, вы меняете селектор только на : div[data-comp="ProductDisplayName "] span[data-at="sku_item_brand"]

Комментарии:

1. Спасибо! Я даже не знал, что вы можете использовать атрибуты данных.