Python 如何在每次循环执行完成后清空列表内的元素
问题原因
你将image_list初始化放在了循环外层,每次处理新商品的循环执行时,都会复用同一个列表对象,自然会累加之前存储的URL。
修复方案
两种实现方式二选一即可:
- 更推荐:把列表初始化放到循环内部,每次处理新商品时自动生成空列表,不会携带上一次的内容
- 在写入CSV完成后,调用
image_list.clear()手动清空列表
同时你原有代码的except块存在变量引用错误:i是try块内for循环的局部变量,如果try块在获取元素阶段就报错,i未定义会触发二次报错,同步给你修正了这部分逻辑,优化了CSV文件打开的重复操作:
import csv from selenium import webdriver # 把CSV文件打开操作放到循环外,避免频繁开闭文件提升性能 with open("product.csv", "a", encoding="utf-8") as f: writeFile = csv.writer(f) for page_num in range(1,6): # 每次处理新页面/新商品时,初始化空的图片列表 image_list = [] # 此处保留你的其他业务代码 try: images = driver.find_elements_by_xpath("//img[@class='Image--fadeIn lazyautosizes Image--lazyLoaded']") for i in images: image = i.get_attribute('data-original-src') image_list.append("https:"+image) print('######image: ',image) except: # 修正原有错误:直接取单个元素的属性,不需要引用未定义的i image = driver.find_element_by_css_selector("#shopify-section-product-template .Image--lazyLoaded").get_attribute('data-original-src') image_list.append("https:"+image) print(image) # 写入当前商品的图片列表 writeFile.writerow([image_list]) # 如果你选第二种手动清空的方案,就把image_list初始化放回外层,这里加一行image_list.clear()
补充说明
如果你的CSV里希望把多个图片URL分开存储而非存在同一个单元格,可以直接把image_list传给writerow方法,不需要套一层列表:writeFile.writerow(image_list)
内容的提问来源于stack exchange,提问作者boyenec
相关产品推荐
相关产品推荐

