Python Selenium - Найти элемент по классу и тексту - PullRequest
0 голосов
/ 03 декабря 2018

Я пытаюсь разбить на страницы результаты этого поиска: Поиск в Amazon .Я получаю 'NoSuchElementException'..'Unable to locate element: < insert xpath here >

Вот HTML:

<div id="pagn" class="pagnHy">
    <span class="pagnLink">
        <a href="/s/ref=sr_pg_2?rh=...">2</a>
    </span>
</div>

Вот xpaths, которые я пробовал:

driver.find_element_by_xpath('//*[@id="pagn" and @class="pagnLink" and text()="2"]')

driver.find_element_by_xpath('//div[@id="pagn" and @class="pagnLink" and text()="2"]')

driver.find_element_by_xpath("//*[@id='pagn' and @class='pagnLink' and text()[contains(.,'2')]]")

driver.find_element_by_xpath("//span[@class='pagnLink' and text()='2']")

driver.find_element_by_xpath("//div[@class='pagnLink' and text()='2']")

Если я просто использую find_element_by_link_text(...) тогда иногда будет выбрана неправильная ссылка.Например, если количество отзывов равно номеру страницы, которую я ищу (в данном случае 2), тогда будет выбран продукт с 2 отзывами вместо номера страницы «2».

Ответы [ 3 ]

0 голосов
/ 03 декабря 2018

Когда я смотрю на разметку, я вижу следующее:

<span class="pagnLink">
    <a href="/s/ref=sr_pg_2?rh=...">2</a>
</span>

Итак, вы хотите найти span с классом pagnLink, который имеет дочерний элемент a стекст 2 или:

'//*[@class="pagnLink"]/a[text()="2"]'
0 голосов
/ 04 декабря 2018

Иногда может быть лучше сделать промежуточный шаг и сначала получить элемент, содержащий результаты.После этого вы просто ищете в этом элементе.Делая это таким образом, вы упрощаете условия поиска.

from selenium import webdriver

url = 'https://www.amazon.com/s/ref=nb_sb_noss_2?url=search-alias%3Daps&fieldkeywords=becoming&rh=i%3Aaps%2Ck%3Abecoming'
driver = webdriver.Firefox()
resp = driver.get(url)
results_list_object = driver.find_element_by_id('s-results-list-atf')
results = results_list_object.find_elements_by_css_selector('li[id*="result"]')

for number, article in enumerate(results):
    print(">> article %d : %s \n" % (number, article.text))
0 голосов
/ 03 декабря 2018

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

driver.find_element_by_xpath('//div[@id="pagn"]/span[@class="pagnLink"]/a[text()="2"]')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...