#python #python-3.x #selenium #selenium-webdriver #beautifulsoup
#python #python-3.x #selenium #selenium-webdriver #beautifulsoup
Вопрос:
Я пытаюсь создать функцию, которая находит любую кнопку «Добавить в корзину» на данном веб-сайте путем поиска текста на кнопке. Например, Amazon говорит «Добавить в корзину», поэтому я использую эту функцию, чтобы попытаться найти кнопку. К сожалению, я получаю:
selenium.common.exceptions.Исключение NoSuchElementException: Сообщение: нет такого элемента: не удается найти элемент: {«метод»:»xpath»,»селектор»:»// div[.=’Добавить в корзину’]»}
def GetElementByText(driver, url, text):
driver.get(url)
element = driver.find_element_by_xpath("//div[.='" text "']")
print(element)
return element
element = GetElementByText(driver, 'https://www.amazon.com/gp/product/B00ZG9U0KA?pf_rd_r=AQC5SP1PPERA8C37YCC8amp;pf_rd_p=5ae2c7f8-e0c6-4f35-9071-dc3240e894a8', 'Add To Cart')
Я также пытался использовать эту функцию, которая работает на других сайтах, но не на Amazon.
def GetButtons(driver, url):
driver.get(url)
html = driver.page_source
driver.quit()
soup = BeautifulSoup(html, 'html.parser')
buttons = soup.find_all('button')
return buttons
GetButtons(driver, 'https://www.amazon.com/gp/product/B00ZG9U0KA?pf_rd_r=AQC5SP1PPERA8C37YCC8amp;pf_rd_p=5ae2c7f8-e0c6-4f35-9071-dc3240e894a8')
Есть ли более простой способ выполнить это динамическим способом, который было бы легко применить к другим веб-сайтам? Меня беспокоит то, что на некоторых веб-сайтах есть кнопки, а на некоторых есть ссылки. Возврат всех ссылок или тегов с помощью BeautifulSoup возвращает слишком много результатов для практической сортировки.
Есть идеи, как это сделать? Функция не обязательно должна автоматически находить кнопку самостоятельно (хотя это было бы здорово), но если бы я мог сузить ее настолько, чтобы выполнить поиск по 10-20 возможным результатам, это было бы идеально.
Ответ №1:
Две вещи.
- На Amazon текст выглядит как «Добавить в корзину» со строчной буквы «кому», у вас он написан заглавной буквой «Кому».
- Изменив ваш xpath на
"//*[.='" text "']"
, я смог его найти (после исправления ошибки To / to). Возможно, он слишком широк для общего применения, но попробовать стоит.
Комментарии:
1. Спасибо, не могу поверить, что я пропустил это за последние несколько часов. Это работает отлично.