如何用Selenium+Python点击指定网页的A-Z按钮?附报错及代码
修复Selenium代码实现A-Z按钮依次点击
看起来你这段Selenium代码确实有几个明显的问题,我来逐个帮你梳理并修复:
原代码的核心问题
- 缺失webdriver导入:直接使用
webdriver.Firefox()但没导入from selenium import webdriver,会导致找不到webdriver对象 - 未定义
alphabets变量:这是你遇到NameError: name 'alphabets' is not defined的直接原因,你需要先定位到页面上包含A-Z按钮的容器元素 - 元素定位方法错误:
find_element_by_tag_name('li')只会获取第一个li元素,应该用复数形式find_elements_by_tag_name('li')获取所有字母按钮 - 循环逻辑混乱:
element = element[elements]这行完全不符合逻辑,循环遍历的element已经是单个li元素,不需要额外索引 - 子元素获取方式错误:Selenium元素没有
children属性,应该用Selenium的官方定位方法获取可点击的按钮 - 缺少页面等待:页面跳转后直接操作元素会因为加载未完成报错,需要添加显式等待
修正后的完整代码
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # 初始化Firefox浏览器驱动 driver = webdriver.Firefox() driver.maximize_window() # 直接打开目标区域列表页面(跳过首页点击步骤,更高效) url = 'http://architects-register.org.uk/list/regions' driver.get(url) try: # 显式等待字母按钮容器加载完成(通过页面源码的class定位) alphabet_container = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.CLASS_NAME, 'alphabet')) ) # 获取所有字母按钮的li元素 letter_buttons = alphabet_container.find_elements(By.TAG_NAME, 'li') # 遍历每个字母按钮并执行点击 for index, button in enumerate(letter_buttons): # 找到li中的a标签(实际可点击的元素)并等待可交互 clickable_btn = WebDriverWait(driver, 5).until( EC.element_to_be_clickable(button.find_element(By.TAG_NAME, 'a')) ) clickable_btn.click() # 等待目标页面加载完成(以区域列表表格为标志) WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.ID, 'ctl00_ContentPlaceHolder1_gvCountries')) ) # 若需要继续点击下一个字母,返回上一页并重新获取按钮列表(页面刷新后旧元素引用失效) if index != len(letter_buttons) - 1: driver.back() alphabet_container = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.CLASS_NAME, 'alphabet')) ) letter_buttons = alphabet_container.find_elements(By.TAG_NAME, 'li') finally: # 无论操作是否成功,最终关闭浏览器释放资源 driver.quit()
代码关键说明
- 直接跳转目标页面:跳过首页点击"UK Counties"的步骤,直接访问区域列表页,减少不必要的操作
- 显式等待机制:所有元素操作前都等待元素加载完成/可交互,避免因页面加载延迟导致的报错
- 元素重新定位:每次返回页面后重新获取字母按钮列表,因为页面刷新后之前的元素引用会失效
- 资源安全释放:使用
try-finally确保浏览器最终会关闭,避免残留驱动进程
内容的提问来源于stack exchange,提问作者Shaun
相关产品推荐
相关产品推荐

