编程新手求助: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进程。
新手额外提示
- 可以用浏览器开发者工具(F12)右键目标元素,选择「复制XPath」来确认你的XPath是否正确,有时候页面的class名可能会动态变化;
- 如果页面需要滚动才能加载更多元素,可能还要添加滚动操作,但先解决当前的提取问题再说;
- 尽量避免使用
find_elements_by_xpath这种旧写法(Selenium 4.x已经不推荐了),改用driver.find_elements(By.XPATH, 'xxx')的形式,我在代码里已经帮你调整了等待部分的写法。
内容的提问来源于stack exchange,提问作者Michael
相关产品推荐
相关产品推荐

