Как очистить HTML страницы и перейти по следующей ссылке в Selenium

#python #selenium

#python #селен

Вопрос:

Я пытаюсь очистить веб-сайт для исследования, и я застрял. Я хочу, чтобы скребок считывал источник страницы и добавлял его в локальный HTML-файл, чтобы я мог анализировать данные за пределами кампуса. Я экспериментировал с BeautifulSoup и Scrapy , но обнаружил, что мне нужно использовать Selenium для взаимодействия со страницей для навигации по системе аутентификации моего университета. (Я не включаю этот код, потому что он имеет отношение к моему вопросу.)

Когда я запускаю скрипт, он переходит на страницу и щелкает по ссылке, но сохраняет только HTML первой страницы. Затем он дублирует и добавляет HTML этой страницы каждый раз, когда нажимает на ссылку.

Как мне использовать Selenium , чтобы щелкнуть ссылку на следующую страницу, очистить HTML и сохранить в файл, пока я не дойду до последней страницы?

 source = driver.page_source

while True:
    with open("test.html", "a") as TestFile:
        TestFile.write(source)
        try:
            driver.implicitly_wait(200)
            driver.find_element_by_css_selector('li.next').click()
        except AttributeError:
            break
  

Редактировать: я добавил AttributeError к except и получил следующую ошибку.

selenium.common.exceptions.Исключение StaleElementReferenceException: Сообщение: устаревшая ссылка на элемент: элемент не прикреплен к документу страницы

Я предполагаю, что мне нужно замедлить .click() , поэтому у меня изначально было неявное ожидание, но, похоже, это не помогает.

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

1. избавьтесь от своего naked except, и вы получите гораздо более информативное сообщение об ошибке

2. Благодаря n1c9, я добавил AttributeError к except, и это дало мне код ошибки, который я добавил выше: Исключение StaleElementReferenceException.

3. есть ли всплывающее окно на странице или что-нибудь в этом роде? или он просто переходит на следующую страницу, как обычно? Кроме того, implicitly_wait(num) предполагается, что он устанавливается при инициализации webdriver, но это всего лишь стилистическая вещь.

4. Он перелистывает страницы в обычном режиме, пока не дойдет до страницы 8 или 9, после чего выдает исключение устаревшего элемента.

Ответ №1:

Вам нужно назначить page source source переменную to внутри цикла while.

 source = driver.page_source

while True:
with open("test.html", "a") as TestFile:
    TestFile.write(source)
    try:
        driver.implicitly_wait(200)
        driver.find_element_by_css_selector('li.next').click()
        source = driver.page_source
    except AttributeError:
        break
  

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

1. Спасибо! Это помогло, но теперь я получаю дубликаты в своих выходных данных для каждой страницы. Например, он выводит: page1page1page2page2page2page3page3

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

3. Я добавил ожидание, как вы и предлагали, и, похоже, оно работает сейчас. Спасибо, @SudharsanSelvaraj

4. Рад вам помочь!!

5. Если это вам поможет, обязательно примите ответ 🙂