使用Selenium保存多网站数据到CSV时遇NameError(df未定义)
问题解决方法
核心问题
你猜的没错,df仅在try块内部定义,若循环中所有请求都触发NoSuchElementException(没有抓取到任何有效数据),df会从未被初始化,后续调用df.to_csv时就会抛出NameError。另外,每次循环都创建DataFrame属于冗余操作,会降低代码效率。
修正后的代码
import pandas as pd from selenium import webdriver from selenium.common.exceptions import NoSuchElementException from selenium.webdriver.common.by import By driver = webdriver.Chrome(executable_path='C:/Users/trive/Downloads/chromedriver_win32/chromedriver.exe') templist = [] for i in range(len(data)): driver.get(data._get_value(i,'URL')) try: title = driver.find_element(By.CLASS_NAME, "amp-wp-title").text content = driver.find_element(By.CLASS_NAME, "amp-wp-article-content").text Table_dict = { 'Title': title, 'Content': content } templist.append(Table_dict) except NoSuchElementException: continue # 循环结束后统一创建DataFrame,同时处理空数据场景 df = pd.DataFrame(templist) if templist else pd.DataFrame(columns=['Title', 'Content']) # 保存CSV,添加index=False避免生成冗余索引列 df.to_csv('S:/DEADPOOL/black coffr assignment/table.csv', index=False) driver.close()
关键修改点
- 将
df = pd.DataFrame(templist)移到循环外部,既避免重复创建DataFrame浪费资源,又确保df一定会被定义。 - 增加空列表判断:如果
templist为空(未抓取到任何数据),则创建一个带指定列的空DataFrame,防止保存CSV时出错。 - 补充必要的模块导入(比如
NoSuchElementException和By),避免潜在的未导入错误。
内容的提问来源于stack exchange,提问作者Siddharth
相关产品推荐
相关产品推荐

