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

编程新手求助:Selenium爬虫无法提取网页信息及报错问题

解决你的Web爬虫提取信息问题

嘿,作为编程新手碰到这种问题太正常啦,我帮你拆解下问题所在,然后给你修正后的方案~

首先看你添加的提取逻辑里的几个明显问题:

  • 变量未定义错误:你写了odds.append(odd),但代码里根本没把找到的元素赋值给odd变量,这肯定会报NameError;
  • 页面加载时机问题:Selenium打开新页面后,页面元素可能还没完全渲染出来,直接调用find_element会找不到元素,抛出NoSuchElementException;
  • 元素选择的单复数问题:如果页面上有多个符合table-main__detail-odds--hasarchive类的span标签,用单数的find_element只能拿到第一个,要是想提取全部,得用find_elements。

修正后的完整代码

我给你调整了代码,加上了关键的等待逻辑和正确的元素提取方式:

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
import csv

driver = webdriver.Firefox()

# 保留你原来获取前两个链接的逻辑
links_code = driver.find_elements_by_xpath('//a[@class="in-match"]')
first_two = links_code[0:2]
first_two_links = []
for i in first_two:
    link = i.get_attribute("href")
    first_two_links.append(link)

odds = []
for link in first_two_links:
    driver.get(link)
    try:
        # 显式等待元素加载,最多等待10秒,避免页面未渲染完成就查找元素
        # 如果你只需要单个元素,把presence_of_all_elements_located换成presence_of_element_located
        odds_elements = WebDriverWait(driver, 10).until(
            EC.presence_of_all_elements_located((By.XPATH, '//span[@class="table-main__detail-odds--hasarchive"]'))
        )
        # 提取每个赔率元素的文本内容,添加到列表
        for elem in odds_elements:
            odds.append(elem.text)
    except Exception as e:
        # 捕获异常,避免单个链接出错导致整个程序终止
        print(f"处理链接 {link} 时出错: {str(e)}")

# 打印提取到的赔率
print("提取到的赔率信息:", odds)

# 可选:将结果保存到CSV文件
with open('odds_result.csv', 'w', newline='', encoding='utf-8') as csv_file:
    writer = csv.writer(csv_file)
    for odd in odds:
        writer.writerow([odd])

# 记得关闭浏览器,避免残留进程
driver.quit()

关键修改说明

  • 显式等待:用WebDriverWait配合expected_conditions等待元素出现,这是解决动态页面加载问题的核心,比强制等待(time.sleep())更高效;
  • 变量修正:正确获取元素并提取文本,不再出现未定义变量的错误;
  • 异常处理:添加try-except块,即使某个链接加载失败,程序也能继续处理下一个;
  • 资源清理:最后调用driver.quit()关闭浏览器,避免后台残留Firefox进程。

新手额外提示

  1. 可以用浏览器开发者工具(F12)右键目标元素,选择「复制XPath」来确认你的XPath是否正确,有时候页面的class名可能会动态变化;
  2. 如果页面需要滚动才能加载更多元素,可能还要添加滚动操作,但先解决当前的提取问题再说;
  3. 尽量避免使用find_elements_by_xpath这种旧写法(Selenium 4.x已经不推荐了),改用driver.find_elements(By.XPATH, 'xxx')的形式,我在代码里已经帮你调整了等待部分的写法。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:07:13