#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. Спасибо! Я даже не знал, что вы можете использовать атрибуты данных.