You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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()

额外小提示

  1. 优先用显式等待(比如WebDriverWait)代替time.sleep(),既保证页面加载完成,又不会浪费不必要的等待时间;
  2. 如果遇到网站反爬,可以适当添加随机延迟(import random; time.sleep(random.uniform(1,3))),模拟人类操作节奏。

内容的提问来源于stack exchange,提问作者Resultados Oficiais

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 05:07:29