python , Selenium : can't find element by xpath when ul list is too long

标签 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)

问题是一旦 i 为 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 包含我要提取的信息(用户名)。即使当我自己浏览网页、打开弹出窗口、稍微滚动并加载所有内容时,我也无法通过在 DOM 的搜索栏中手动键入 xpath 来找到我正在寻找的元素。虽然路径是正确的,但我可以通过查看 DOM 来检查它。

我尝试过各种用于 selenium 的网络驱动程序,目前我使用的是 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 访问列表的任何元素,即使是那些元素在我开始滚动之前已经加载。

最佳答案

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

关于 python , Selenium : can't find element by xpath when ul list is too long,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54053971/

相关文章:

ruby - 无法找到 chromedriver 可执行文件

python - 在 Python 2.7 上使用 xpath 提取 href 值

javascript - 如何在Reactjs中启用CORS?

python - 在python中的函数调用外部重印错误

python - 单击按钮之前执行 Tkinter 按钮命令

c# - OpenQA.Selenium.NoSuchElementException 未处理 + C# + 另一个网站

python - 年龄分布的 Numpy 梯形分布

java - 通过 webdrivermanager 使用 Selenium 运行 Opera 浏览器时出现问题

html - xpath忽略节点

java - 区分具有相同类的两个 html 元素