Python, Selenium: не удается найти элемент по xpath, когда список ul слишком длинный - PullRequest
0 голосов
/ 05 января 2019

Я пытаюсь создать программу, извлекающую всех людей, за которыми я следую в Instagram. Я использую Python, Selenium и Chromedriver.

Для этого я сначала получаю количество подписчиков и нажимаю на кнопку «следующий»: `

nb_abonnements = int(webdriver.find_element_by_xpath('/html/body/span[1]/section[1]/main/div[1]/header/section[1]/ul/li[3]/a/span').text)

sleep(randrange(1,3))
abonnements = webdriver.find_element_by_xpath('/html/body/span[1]/section[1]/main/div[1]/header/section[1]/ul/li[3]/a')
abonnements.click()

Затем я использую следующий код, чтобы получить подписчиков и прокрутить всплывающую страницу на случай, если я не смогу ее найти:

followers_panel = webdriver.find_element_by_xpath('/html/body/div[3]/div/div/div[2]')
while i < nb_abonnements:
    try:
        print(i)
        followed = webdriver.find_element_by_xpath('/html/body/div[3]/div/div/div[2]/ul/div/li[{}]/div/div[2]/div/div/div/a'.format(i+1)).text
        #the followeds are in an ul-list
        i += 1
        followed_list.append(followed)
        except NoSuchElementException:
        webdriver.execute_script(
            "arguments[0].scrollBy(0,400)",followers_panel
        )
        sleep(7)

Проблема в том, что как только мне исполнится 12, программа вызывает исключение и прокручивает. Оттуда он все еще не может найти следующего последователя и застрял в цикле, где он делает только прокрутку. Я проверил исходный код страницы IG, и оказалось, что путь все еще хорош, но, очевидно, я не могу получить доступ к элементам, как я делаю больше, вероятно, потому что ul-list, в котором я обращаюсь к ним, стал long (строка 5 программы).

Я не могу понять, как это решить. Я надеюсь, что вы окажете некоторую помощь.

ОБНОВЛЕНИЕ: DOM выглядит так:

html
    body
        span
        script
        ...
        div[3]
              div
                 ...
                     div
                         div
                         div[2]
                               ul
                                 div
                                    li
                                    li
                                    li
                                    li
                                    ...
                                    li

ul - список подписчиков. li содержат информацию, которую я пытаюсь извлечь (имя пользователя). Даже когда я сам захожу на веб-страницу, открываю всплывающее окно, немного прокручиваю и позволяю всем загружаться, я не могу найти искомый элемент, набрав xpath в строке поиска DOM вручную. Хотя путь правильный, я могу проверить его, посмотрев на DOM.

Я пробовал различные веб-драйверы для селена, в настоящее время я использую chromedriver 2.45.615291. Я также установил явное ожидание для ожидания показа элемента (WebDriverWait(webdriver, 10).until(EC.presence_of_element_located((By.XPATH, '/html/body/div[3]/div/div/div[2]/ul/div/li[{}]/div/div[2]/div/div/div/a'.format(i+1))))), но я просто получаю исключение тайм-аута: selenium.common.exceptions.TimeoutException: Message:.

Похоже, что если список ul слишком длинный (то есть с того момента, как я прокрутил его достаточно, чтобы загрузить новых людей), я не могу получить доступ ни к одному элементу списка по его XPATH, даже к элементам, которые были уже загружены, прежде чем я начал прокручивать.

Ответы [ 2 ]

0 голосов
/ 06 января 2019

У меня есть решение: я просто получаю доступ к элементу через XPATH так: find_element_by_xpath("(//*[@class='FPmhX notranslate _0imsa '])[{}]".format(i)). Я не знаю, почему это не сработало, но вот так все работает.

0 голосов
/ 06 января 2019

Вместо использования xpath для каждого дочернего элемента ... найдите элемент ul-list, а затем найдите все дочерние элементы, используя что-то вроде: ul-list element.find_elements_by_tag_name (). Затем выполните итерацию по каждому элементу в коллекции и получите необходимый текст

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...