如何解决Selenium爬取ESPN数据经pygsheets更新Google Sheets的写入报错
报错根因与修复方案
核心错误原因
- 代码执行顺序存在致命逻辑问题:代码先通过Selenium定位到网页元素、将元素引用暂存在变量中,随后立刻执行
driver.close()销毁了整个浏览器会话,之后才尝试读取greenBay[0].text的值传入Google Sheets更新接口 - Selenium定位到的WebElement属于动态引用对象,完全绑定在活跃的浏览器会话上。会话关闭后所有元素引用都会失效,此时读取
.text属性会抛出元素过期异常,根本无法拿到控制台能正常打印的正确文本,传入update_value接口的不是合法的可写入字符串,自然触发报错 - 硬编码测试文本"Testing"属于普通Python字符串,完全不依赖浏览器会话,因此可以正常写入,和抓取到的网页文本存在本质区别
具体修复步骤
- 调整代码执行顺序:所有需要从网页元素提取的文本内容,必须在浏览器会话存活期间读取完成,存储为普通Python字符串变量,全部提取完成后再执行关闭浏览器的操作
- 参考调整后的关键代码片段:
# 会话存活时,把所有需要的文本全部读取为普通字符串 gb_text = gbData.text buf_text = bufData.text kc_text = kcData.text no_text = noData.text greenBay_first_text = greenBay[0].text # 所有数据提取完成后,再关闭浏览器 driver.close() # 后续操作Google Sheets时,直接使用提前存储的字符串变量 print(greenBay_first_text) wks.update_value('A2', greenBay_first_text) wks.update_value('B2', buf_text) wks.update_value('C2', kc_text) wks.update_value('D2', no_text)
额外注意事项
- pygsheets的写入接口仅支持基础Python数据类型(字符串、数字、布尔值),不要将Selenium的WebElement对象、未完成文本提取的动态引用变量直接传入写入方法
- 可以将固定时长的
time.sleep(2)替换为Selenium显式等待机制,避免页面未加载完成导致的元素定位偏差,这部分优化不影响当前报错的修复逻辑
内容的提问来源于stack exchange,提问作者ryanbuckner
相关产品推荐
相关产品推荐

