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

如何使用driver.get(url)遍历访问页面提取的href链接列表?

解决Selenium遍历访问提取到的Href链接问题

你的代码核心问题有两个:

  • 循环内重复执行driver.find_elements完全多余,还会覆盖初始获取的元素列表
  • driver.get(aa)传入的是元素对象列表,而driver.get()要求传入字符串格式的URL,必须从每个元素中提取href属性值

修正步骤

  1. 先等待目标元素加载完成,一次性提取所有元素的href链接并存入列表(处理可能的相对链接,拼接网站域名)
  2. 遍历链接列表,逐个调用driver.get()访问页面
  3. 每个页面加载完成后提取数据,存入pandas DataFrame

修正后的完整代码

import time
import pandas as pd
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait
from webdriver_manager.chrome import ChromeDriverManager

# 初始化浏览器
options = webdriver.ChromeOptions()
options.add_argument('--start-maximized')
options.add_experimental_option("detach", True)
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=options)

# 访问主页面
base_url = "https://www.bookmaker.com.au"
driver.get(f"{base_url}/sports/soccer")

# 等待目标元素加载完成,提取所有href链接
wait = WebDriverWait(driver, 15)
# 等待元素可见(比presence更可靠,确保元素可交互)
wait.until(EC.visibility_of_all_elements_located((By.CSS_SELECTOR, "a[class *= 'matches-filter__region']")))
# 提取所有链接,处理相对链接
region_links = []
elements = driver.find_elements(By.CSS_SELECTOR, "a[class *= 'matches-filter__region']")
for elem in elements:
    href = elem.get_attribute('href')
    # 处理相对链接(如果网站返回的是相对路径)
    if not href.startswith('http'):
        href = f"{base_url}{href}"
    region_links.append(href)

# 准备存储数据的DataFrame,可根据实际需求调整列名
columns = ["页面标题", "区域名称", "赛事数量"]
df = pd.DataFrame(columns=columns)

# 遍历链接逐个访问并提取数据
for link in region_links:
    driver.get(link)
    # 等待页面加载完成,建议用WebDriverWait等待页面关键元素,这里用sleep做示例
    time.sleep(2)
    # 示例:提取页面标题和区域名称(需根据目标页面实际HTML结构调整选择器)
    page_title = driver.title
    region_name = driver.find_element(By.CSS_SELECTOR, "h1").text
    # 示例:提取赛事数量(假设赛事数量在特定class标签内)
    match_count = driver.find_element(By.CSS_SELECTOR, ".matches-count").text if driver.find_elements(By.CSS_SELECTOR, ".matches-count") else "无数据"
    
    # 将数据添加到DataFrame
    new_row = pd.DataFrame({
        "页面标题": [page_title],
        "区域名称": [region_name],
        "赛事数量": [match_count]
    })
    df = pd.concat([df, new_row], ignore_index=True)

# 可选:关闭浏览器
# driver.quit()

# 打印结果
print(df)

关键说明

  • 提前一次性提取所有href链接:页面跳转后原页面的元素会变为stale,提前存好链接可避免元素失效问题
  • 处理相对链接:部分网站的href返回相对路径,必须拼接base URL才能正常访问
  • 页面等待:优先使用WebDriverWait等待特定元素加载,比time.sleep更稳定,可根据目标页面的核心元素调整等待条件
  • 数据提取逻辑:需要根据每个目标页面的实际HTML结构,修改CSS选择器或XPath来提取对应数据

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 22:55:24