我试图使用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_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文档中阅读它们。
祝你好运,我希望这能有所帮助。
我没有找到使用find_element_by_xpath的答案。但是,如果您使用driver.find_element_by_css_selector,它也可以正常工作。因此,如果有人有同样的问题,那是一个可能的解决方案。