为什么我的Selenium选择器返回字典?(Django/Python 3.8)
问题1:AttributeError: 'dict' object has no attribute 'text' 解决方案
该错误的核心原因是升级Selenium后,版本与PythonAnywhere预装的ChromeDriver兼容性不匹配,导致WebDriver没有把返回结果序列化为标准WebElement对象,直接返回了W3C协议的原始字典结构。可按以下步骤修复:
- 先确认版本匹配关系:Selenium 4.x需要搭配ChromeDriver 96及以上版本,你可以在PythonAnywhere的控制台执行
chromedriver --version查看当前ChromeDriver版本 - 替换已废弃的元素定位语法:Selenium 4已经完全废弃
find_element_by_class_name这类直接调用的定位方法,需要改用By类实现定位,同时补充PythonAnywhere容器环境必须的启动参数,修改后的代码如下:
from selenium import webdriver from selenium.webdriver.common.by import By def Synonym(): chrome_options = webdriver.ChromeOptions() chrome_options.add_argument("--headless=new") # 新版headless模式兼容性更优 chrome_options.add_argument("--disable-gpu") chrome_options.add_argument("--no-sandbox") # 无root权限环境必须添加该参数 chrome_options.add_argument("--disable-dev-shm-usage") browser = webdriver.Chrome(options=chrome_options) browser.get("https://www.synonym.com/synonyms/test") test = browser.find_element(By.CLASS_NAME, "logo").text browser.quit() return test
- 如果修改后仍然返回字典结构,可将Selenium降级到兼容性最稳定的3.141.0版本,执行命令
pip install selenium==3.141.0即可。
问题2:避免Selenium在/tmp目录生成文件
Chrome/ChromeDriver运行时必须生成临时用户数据、沙箱文件、日志等内容,无法完全阻止生成,但可以通过启动参数将存储路径迁移到你自己的项目目录,避免写入系统/tmp目录:
- 提前在你的项目目录下创建一个有读写权限的临时文件夹,比如
/home/你的用户名/你的项目路径/chrome_temp - 在Chrome启动参数中添加自定义临时目录配置,同时添加参数减少不必要的临时文件生成:
chrome_options.add_argument("--user-data-dir=/home/你的用户名/你的项目路径/chrome_temp") chrome_options.add_argument("--disk-cache-dir=/home/你的用户名/你的项目路径/chrome_cache") chrome_options.add_argument("--disable-crash-reporter") chrome_options.add_argument("--disable-logging") chrome_options.add_argument("--log-level=3")
- 你也可以在每次调用
browser.quit()之后,手动删除自定义临时目录下的内容,彻底清理生成的文件。
内容的提问来源于stack exchange,提问作者Madison
相关产品推荐
相关产品推荐

