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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 09:24:05