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

Selenium爬虫IndexError与UnboundLocalError解决及CSV导出方法

问题修复与实现方案

1. 解决元素缺失报错与UnboundLocalError问题

问题根源有两个:

  • 所有元素查找逻辑放在同一个try块中,任意一个元素缺失触发IndexError后,后续所有字段的赋值逻辑都会直接中断
  • 变量没有提前设置默认值,触发异常后未完成赋值的变量被引用就会抛出UnboundLocalError

推荐的修复方式是封装独立的元素提取工具函数,单个字段缺失不影响其他字段的抓取,也不会出现变量未定义问题,修改后代码如下:

def get_element_text(browser, xpath):
    """单独封装元素提取逻辑,找不到元素就返回空字符串"""
    try:
        elements = browser.find_elements(By.XPATH, xpath)
        return elements[0].text if elements else ''
    except IndexError:
        return ''

def scrape():
    browser.implicitly_wait(7)
    # 所有字段直接调用工具函数,自动兼容元素缺失场景
    collection = get_element_text(browser, '//*[@id="page-content-wrapper"]/div/ul/li[5]/a')
    description = get_element_text(browser, '//*[(@id = "child-1")]//p')
    dimension = get_element_text(browser, '//*[(@id = "detailed-description")]//div[(((count(preceding-sibling::*) + 1) = 1) and parent::*)]//p')
    finish = get_element_text(browser, '//*[(@id = "detailed-description")]//div[(((count(preceding-sibling::*) + 1) = 2) and parent::*)]//p')
    country = get_element_text(browser, '//*[(@id = "detailed-description")]//div[(((count(preceding-sibling::*) + 1) = 3) and parent::*)]//p')
    manufacturer = get_element_text(browser, '//div[(((count(preceding-sibling::*) + 1) = 4) and parent::*)]//p')
    
    print(collection, description, dimension, finish, country, manufacturer)
    browser.back()
    # 返回当前页面抓取结果,供后续写入CSV
    return [collection, description, dimension, finish, country, manufacturer]

2. 导出抓取数据为CSV文件

直接使用Python标准库csv即可实现,不需要安装额外依赖,示例逻辑如下:

import csv

# 替换为你要爬取的所有页面URL列表
url_list = ["目标URL1", "目标URL2"]
# 自定义CSV表头
headers = ["系列", "描述", "尺寸", "饰面", "产地", "制造商"]

# 打开CSV文件,使用utf-8-sig编码避免中文乱码
with open("抓取结果.csv", "w", newline="", encoding="utf-8-sig") as f:
    writer = csv.writer(f)
    # 写入表头
    writer.writerow(headers)
    # 循环爬取每个页面
    for url in url_list:
        browser.get(url)
        # 调用scrape函数获取当前页面数据
        row_data = scrape()
        # 写入当前行数据
        writer.writerow(row_data)

如果是增量爬取,把文件打开模式从w改为a即可,会在原有CSV末尾追加新数据,不会覆盖之前的结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 07:30:00