driver.find_elements_by_xpath随机失败

问题描述 投票:0回答:2

我正在尝试使用Selenium和find_elements_by_xpath抓取数据,但是它随机失败,我不知道为什么。这是代码:

import time

# Open chrome and go to website
driver = webdriver.Chrome()

url = "https://fortnitetracker.com/events/epicgames_S11_DH_Anaheim_Stage3"
driver.get(url)

i = 1;

while i < 100:
    i = str(i)
    xpath = "/html/body/div[4]/div[2]/div[3]/div[1]/div/div[2]/table/tbody/tr[" + i + "]/td[2]/div"
    player = driver.find_elements_by_xpath(xpath)
    print(player)
    text = player[0].text
    print(text)
    i = int(i)
    i += 1

我得到的错误如下:

Traceback (most recent call last):
  File "C:/Users/Kristian/PycharmProjects/Tutorial/getnames.py", line 21, in <module>
    text = player[0].text
IndexError: list index out of range

但是,错误并非总是在同一行上发生。有时它会获得13行数据,即14、15行,但永远不会超过18行。我不知道为什么会这样,因为xpath总是正确的。任何帮助表示赞赏。

python selenium selenium-webdriver selenium-chromedriver
2个回答
0
投票

我没有找到使用find_element_by_xpath的答案。但是,如果您使用driver.find_element_by_css_selector,它就可以正常工作。因此,如果任何人都有相同的问题,那是一个可能的解决方案。


0
投票

您正在使用find_elements_by_xpath,此方法总是返回一个数组。如果找到元素,它将返回一个元素数组,否则,将返回一个空数组。

因此,如果元素未显示在页面上,则find_elements_by_xpath将搜索,什么也找不到,您将获得player = []

然后,当您执行text = player[0].text时,它将尝试在空数组中找到索引为0的元素。这将导致IndexError: list index out of range

如何解决这个问题?

一种简单的解决方案是在搜索之前添加一小段时间(例如0.5秒):

time.sleep(0.5)
player = driver.find_elements_by_xpath(xpath)

此解决方案有效,但会降低脚本速度,因为循环的每次迭代将增加0.5秒。一个更优雅,更可取的解决方案是添加一个隐式或显式等待,您可以在官方Python Selenium Waits doc中阅读有关它们的信息。

祝您好运,希望对您有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.