Selenium选择下拉框时触发AttributeError问题求助
问题:Selenium操作下拉框时出现AttributeError错误
错误场景与报错信息
原本运行正常的NBA数据爬取代码,近期执行下拉框遍历操作时出现错误。
原代码报错
File C:\Program Files\Spyder\pkgs\spyder_kernels\py3compat.py:356 in compat_exec exec(code, globals, locals) File c:\users\shawn\documents\python scripts\webscraping\basketball\nba stats scrape daily update.py:42 select = Select(browser.find_element(by=By.CLASS_NAME, value="DropDown_select__4pIg9")) File C:\Python310\Lib\site-packages\selenium\webdriver\support\select.py:36 in __init__ if webelement.tag_name.lower() != "select": AttributeError: 'dict' object has no attribute 'tag_name'.
修改后报错
将代码改为select = Select(browser.find_element(by=By.CLASS_NAME, value="DropDown_select__4pIg9")['ELEMENT'])后,出现新错误:
Traceback (most recent call last): File C:\Program Files\Spyder\pkgs\spyder_kernels\py3compat.py:356 in compat_exec exec(code, globals, locals) File c:\users\shawn\documents\python scripts\webscraping\basketball\nba stats scrape daily update.py:42 select = Select(browser.find_element(by=By.CLASS_NAME, value="DropDown_select__4pIg9")['ELEMENT']) File C:\Python310\Lib\site-packages\selenium\webdriver\support\select.py:36 in __init__ if webelement.tag_name.lower() != "select": AttributeError: 'str' object has no attribute 'tag_name'
完整原代码
from selenium import webdriver from selenium.webdriver.common.keys import Keys import time from selenium.webdriver.support.ui import Select from bs4 import BeautifulSoup import pandas as pd import os import datetime import numpy as np import lxml from selenium.webdriver.common.by import By #os.chdir(r'C:\Users\shawn\Documents\Python Scripts\Webscraping') directory = os.getcwd() beginningTime = time.time() ##Change the file path to where your chromedriver.exe file is browser = webdriver.Chrome(r'C:\Temp\ChromeDriver\chromedriver.exe') url = 'https://www.nba.com/stats/players/boxscores' browser.get(url) browser.maximize_window() x = 1 dfStats = [] for x in range(50): x+=1 time.sleep(10) print(x) select = Select(browser.find_element(by=By.CLASS_NAME, value="DropDown_select__4pIg9")) select.select_by_visible_text(str(x)) table = browser.find_element_by_class_name('Crom_table__p1iZz').get_attribute('outerHTML') soup = BeautifulSoup(table, 'html.parser') dfData = pd.read_html(str(soup))[0] print(dfData.head()) print(dfData.shape) dfStats.append(dfData) print(dfStats)
解决方案
核心问题分析
出现'dict' object has no attribute 'tag_name'或'str' object has no attribute 'tag_name'错误,本质是browser.find_element()返回的不是预期的WebElement对象,通常由以下原因导致:
- Selenium与ChromeDriver版本不兼容,导致元素返回格式异常;
- 元素定位方式不准确,获取到的不是
<select>标签元素; - 页面未完全加载就执行操作,元素处于未就绪状态。
具体修复步骤与代码
- 检查并匹配版本:确保ChromeDriver版本与本地Chrome浏览器大版本一致,同时升级Selenium到最新稳定版;
- 精准定位select元素:改用XPATH定位到真正的
<select>标签,避免误获取其他同名类的元素; - 替换固定sleep为显式等待:确保元素加载完成并可交互后再执行操作;
- 优化循环逻辑:修正循环范围,避免页码偏移。
修改后的代码:
from selenium import webdriver from selenium.webdriver.common.keys import Keys import time from selenium.webdriver.support.ui import Select from bs4 import BeautifulSoup import pandas as pd import os import datetime import numpy as np import lxml from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC directory = os.getcwd() beginningTime = time.time() # 确保ChromeDriver路径正确,版本与Chrome浏览器匹配 browser = webdriver.Chrome(r'C:\Temp\ChromeDriver\chromedriver.exe') url = 'https://www.nba.com/stats/players/boxscores' browser.get(url) browser.maximize_window() dfStats = [] # 设置20秒的显式等待超时时间 wait = WebDriverWait(browser, 20) # 循环遍历1到50页 for page_num in range(1, 51): print(page_num) # 等待下拉框元素可点击 select_element = wait.until(EC.element_to_be_clickable((By.XPATH, "//select[contains(@class, 'DropDown_select__4pIg9')]"))) select = Select(select_element) select.select_by_visible_text(str(page_num)) # 等待表格元素加载完成 table = wait.until(EC.presence_of_element_located((By.CLASS_NAME, 'Crom_table__p1iZz'))).get_attribute('outerHTML') soup = BeautifulSoup(table, 'html.parser') dfData = pd.read_html(str(soup))[0] print(dfData.head()) print(dfData.shape) dfStats.append(dfData) # 关闭浏览器 browser.quit() print(dfStats)
关键修复点说明
- 版本匹配:ChromeDriver和Chrome浏览器版本不匹配是常见的元素返回格式异常原因,需确保两者大版本一致,可从Chrome官方下载对应版本的ChromeDriver;
- XPATH定位:
//select[contains(@class, 'DropDown_select__4pIg9')]确保只定位到<select>标签的下拉框,避免获取到其他使用相同类名的非select元素; - 显式等待:
WebDriverWait配合expected_conditions可以智能等待元素状态,比固定time.sleep()更高效且稳定; - 循环优化:
range(1,51)直接生成1到50的页码,避免原循环中x+=1导致的页码从2开始的问题。
内容的提问来源于stack exchange,提问作者Shawn Schreier
相关产品推荐
相关产品推荐

