Python列表推导式导致Selenium While循环运行异常问题求助
问题原因及解决思路
问题1:无法从super_list调用.text获取内容
- 本质原因:Selenium的
FirefoxWebElement是和当前浏览器会话、当前打开的页面绑定的临时对象,页面跳转、会话关闭后这些元素引用会直接失效,本身也不支持序列化持久存储,不能直接存入列表后续读取。 - 解决方法:必须在获取到元素的当前页面,当场提取需要的文本、属性等内容,转为字符串/字典等原生数据类型再存入列表。
问题2:提取entry.text时程序运行失败
- 本质原因:原代码只等待了父容器
grid-items-section的存在,但是容器内的li子元素、以及子元素内的文本还没完成渲染,此时调用.text要么拿到空值,要么因为元素未就绪触发隐式异常,被裸except捕获直接终止循环。 - 解决方法:修改等待逻辑,直接等待所有li子元素加载完成后再提取文本,同时加短延迟确保文本渲染完成。
问题3:加finally后只跑第一页
- 本质原因:原代码把
finally代码块放在了while循环内部的try语句下,每一轮循环不管执行成功还是抛出异常,都会执行driver.quit()关闭浏览器,第一轮循环结束浏览器就被关掉了,自然无法跑后续页面。 - 解决方法:把
driver.quit()放到整个while循环的外面,等所有页面爬取完成后再关闭浏览器。
修正后的可运行代码
from selenium import webdriver from selenium.webdriver.firefox.options import Options from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC import time options = Options() options.headless = True driver = webdriver.Firefox(options = options) driver.get('https://www.last.fm/tag/jazz+metal/artists?page=20') super_list = [] wait = WebDriverWait(driver, 10) while True: try: # 直接等待所有li元素加载完成,不用单独等待父容器 grid_children = wait.until( EC.presence_of_all_elements_located((By.CSS_SELECTOR, '.grid-items-section li')) ) # 加0.5秒短延迟确保文本渲染完毕,避免读取到空内容 time.sleep(0.5) # 当场提取所有非空文本存入列表,需要其他信息比如艺术家链接可同步提取 page_entries = [entry.text.strip() for entry in grid_children if entry.text.strip()] super_list.extend(page_entries) # 检查下一页按钮是否可点击,最后一页的下一页按钮为禁用状态,不可点击则终止 next_btn = wait.until( EC.element_to_be_clickable((By.CLASS_NAME, 'pagination-next')) ) next_btn.click() # 点击下一页后等待旧页面元素失效,避免下一轮循环读取到上一页的残留元素 wait.until(EC.staleness_of(grid_children[0])) except Exception as e: print(f"爬取终止,原因:{str(e)}") break # 所有页面爬取完成后再关闭浏览器 driver.quit() # 验证结果可取消下方注释 # for entry in super_list: # print(entry)
内容的提问来源于stack exchange,提问作者user183173
相关产品推荐
相关产品推荐

