使用Selenium循环依次打开Soccerway页面链接时仅加载第一个链接的问题咨询
解决Selenium循环打开链接仅执行一次的问题
这个问题我之前做爬虫时也踩过坑,核心原因是页面跳转后原DOM元素失效了,咱们一步步拆解解决:
问题根源
你原来的代码是直接遍历通过find_elements_by_xpath获取的元素集合,当第一次调用driver.get(level_2)跳转到新页面后,原页面的DOM已经被完全替换,之前拿到的links_level_2里的元素就变成了「过时元素」(Stale Element),程序后续无法再访问这些元素,自然就停在第一个链接了。
修改方案:先收集所有链接字符串,再循环访问
我们需要先把所有目标链接的href属性值提取出来,存到一个本地列表里,再循环这个列表打开每个链接——这样就彻底摆脱了原页面DOM的束缚,不会受页面跳转影响。
修改后的代码如下:
from selenium import webdriver # 可选:导入等待模块,确保页面加载完成 from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By url = "https://int.soccerway.com/international/europe/european-championships/c25/" driver = webdriver.Chrome() # 根据你使用的浏览器调整,比如Firefox、Edge等 driver.get(url) # 第一步:先把所有二级菜单的链接提取到本地列表 links_list = [] level_2_elements = driver.find_elements_by_xpath("//ul[contains(@class,'level-2')]/li/a") for elem in level_2_elements: link_href = elem.get_attribute("href") if link_href: # 过滤掉可能存在的空链接 links_list.append(link_href) # 第二步:循环访问列表里的每个链接 for link in links_list: driver.get(link) # 可选:添加等待逻辑,确保页面加载完成后再执行后续操作 WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.TAG_NAME, "body"))) # 这里写你需要在每个页面执行的逻辑,比如爬取数据、点击元素等 print(f"已成功打开链接:{link}") # 最后记得关闭浏览器 driver.quit()
额外小提示
- 优先用显式等待(比如
WebDriverWait)代替time.sleep(),既保证页面加载完成,又不会浪费不必要的等待时间; - 如果遇到网站反爬,可以适当添加随机延迟(
import random; time.sleep(random.uniform(1,3))),模拟人类操作节奏。
内容的提问来源于stack exchange,提问作者Resultados Oficiais
相关产品推荐
相关产品推荐

