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
相关产品推荐
相关产品推荐

