我尝试遍历每10秒刷新一次的列表。你知道吗
这就是我尝试过的:
driver.get("https://www.winmasters.ro/ro/live-betting/")
events = driver.find_elements_by_css_selector('.event-wrapper.v1.event-live.odds-hidden.event-sport-1')
for i in range(len(events)):
try:
event = events[i]
name = event.find_element_by_css_selector('.event-details-team-name.event-details-team-a')# the error occurs here
except: # NoSuchElementException or StaleElementReferenceException
time.sleep(3) # i have tried up to 20 sec
event = events[i]
name = event.find_element_by_css_selecto('.event-details-team-name.event-details-team-a')
这不起作用,所以我尝试了另一个除了
except: # second try that also did not work
element = WebDriverWait(driver, 20).until(
EC.presence_of_all_elements_located((By.CSS_SELECTOR, '.event-details-team-name.event-details-team-a'))
)
name = event.find_element_by_css_selecto('.event-details-team-name.event-details-team-a')
现在我将一些我永远不会用到的东西分配给name
,比如:
try:
event = events[i]
name = event.find_element_by_css_selector('.event-details-team-name.event-details-team-a')
except:
name = "blablabla"
有了这个代码,当页面刷新时,我得到了大约7或8个“blabla”,直到它从网页中再次找到我的选择器
一个主要问题是,您需要预先获取所有元素,然后遍历该列表。由于页面本身正在频繁更新,您已经获取的元素变得“过时”,这意味着它们与当前DOM对象的关联时间不长。当您尝试使用那些过时的元素时,Selenium会抛出StaleElementReferenceExceptions,因为它无法处理那些现在已经过时的对象。你知道吗
克服这一问题的一种方法是只获取和使用您需要的元素,而不是预先获取它们。我个人认为最干净的方法是使用CSS^{} 方法:
如果运行上述脚本,则会得到以下输出:
现在,由于底层网页确实更新了很多,所以仍然有相当大的机会出现一个SERE错误。为了克服这个问题,可以使用retry decorator(
pip install retry
获取包)来处理SERE并重新获取元素:现在,尽管有上述示例,我认为您的CSS选择器仍然存在问题,这是NoSuchElement异常的主要原因。如果没有更好的描述,我无法帮助你用这个脚本实际完成什么。你知道吗
您可以使用JavaScript获取所有必需的数据。
下面的代码将立即为您提供事件列表
map
,其中包含所有详细信息,并且没有NoSuchElementException
或StaleElementReferenceException
错误:我的id:唯一标识符
href:href,包含可用于获取详细信息的详细信息
团队a:第一个团队的名称
球队得分第一队得分
团队\u b:第二个团队的名称
球队得分:第二队得分
事件状态:事件的状态 事件时钟:事件时间
相关问题 更多 >
编程相关推荐