我正在尝试使用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总是正确的。任何帮助表示赞赏。
我没有找到使用find_element_by_xpath的答案。但是,如果您使用driver.find_element_by_css_selector,它就可以正常工作。因此,如果任何人都有相同的问题,那是一个可能的解决方案。
您正在使用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中阅读有关它们的信息。
祝您好运,希望对您有所帮助。