Python,Selenium:当ul列表过长时,无法通过xpath查找元素

时间:2019-01-05 16:35:17

标签: python selenium xpath selenium-chromedriver

我正在尝试创建一个程序,以提取我在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已变为长(程序的第5行)。

我不知道如何解决这个问题。希望您会有所帮助。

更新:DOM看起来像这样:

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

ul是关注者的列表。 li包含我要提取的信息(用户名)。即使我自己一个人走在网页上,打开弹出窗口,稍微滚动并加载所有内容,也无法通过在DOM的搜索栏中手动键入xpath来找到所需的元素。尽管路径是正确的,但我可以通过查看DOM进行检查。

我已经尝试过各种用于硒的Web驱动程序,目前我正在使用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 :(得分:1)

不是对每个子元素都使用xpath,而是使用ul-list element.find_elements_by_tag_name()查找ul-list元素,然后查找所有子元素。然后遍历集合中的每个元素并获取所需的文本

答案 1 :(得分:0)

我提供了一个解决方案:我只是通过XPATH这样访问元素:find_element_by_xpath("(//*[@class='FPmhX notranslate _0imsa '])[{}]".format(i))。我不知道为什么它不能以其他方式起作用,但是像这样,它可以正常工作。