Selenuim Python проблема с получением элементов в цикле - PullRequest
0 голосов
/ 30 октября 2018
soup = BeautifulSoup(browser.page_source, "html.parser")
for h1 in soup.find_all('h2'):
    try:
        array.append("https://www.chamberofcommerce.com" + h1.find("a")['href'])
        print("https://www.chamberofcommerce.com" + h1.find("a")['href'])
    except:
        pass

input=browser.find_element_by_xpath('//a[@class="next"]')
while input:
    input.click()
    time.sleep(10)
    soup = BeautifulSoup(browser.page_source, "html.parser")

    for h1 in soup.find_all('h2'):
        try:
            array.append("https://www.chamberofcommerce.com" + h1.find("a")['href'])
            print("https://www.chamberofcommerce.com" + h1.find("a")['href'])
        except:
            pass

Эта часть кода удаляет URL-адреса списков на желтых страницах, код работал нормально, пока я не использовал для удаления URL-адреса только с первой страницы поиска. Теперь я хочу, чтобы он нажимал на следующую кнопку, пока страницы поиска не закончатся. Пример: если у вас 20 страниц поиска, то бот selenuim должен нажать на кнопку «Далее» и удалить URL, пока не достигнет 20-й страницы,

Пожалуйста, ознакомьтесь с логикой кода, а также я получаю следующую ошибку после того, как бот достигает страницы 2, где фактическое количество страниц равно 15 и происходит сбой на странице 2:

selenium.common.exceptions.StaleElementReferenceException: Message: stale element reference: element is not attached to the page document

1 Ответ

0 голосов
/ 30 октября 2018

while input - это не то, что вам нужно ... Обратите внимание, что после нажатия кнопки «Далее» загружается новая страница, и все веб-элементы с предыдущей страницы больше не действительны: вы должны переопределить их на каждой странице. Попробуйте следующий подход:

while True:
    try:
        browser.find_element_by_xpath('//a[@class="next"]').click()
    except:
        break

Используя приведенный выше код, вы сможете нажимать кнопку «Далее» на каждой странице, пока она доступна. Вам также может понадобиться применить ExplicitWait , чтобы дождаться нажатия кнопки «Далее»:

wait.until(EC.element_to_be_clickable((By.XPATH, '//a[@class="next"]'))).click()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...