Selenium爬取登录后网站报错:NameError: name 'By' is not defined
问题解决:Selenium中
NameError: name 'By' is not defined 核心原因
你代码里使用了By.CSS_SELECTOR、By.NAME这类定位方式,但没有导入By类,Python找不到这个名称,所以抛出NameError。更换定位方式没用,因为所有By.xxx的用法都依赖这个未导入的类。
修复步骤
- 导入
By类
在Selenium相关的导入部分,新增一行代码:
from selenium.webdriver.common.by import By
- 修正变量名错误
代码里定义了username = driver.find_element(...),但后续调用的是username_input.send_keys(...),变量名不匹配会触发新的NameError,要统一变量名:
username = driver.find_element(By.CSS_SELECTOR, '#email_address') password = driver.find_element(By.CSS_SELECTOR, '#password') username.send_keys('EMAIL') # 把username_input改为username password.send_keys('PASS') # 把password_input改为password
- 优化隐式等待(可选但推荐)
隐式等待只需要在初始化driver后设置一次即可,不需要重复调用,比如:
driver = webdriver.Chrome() driver.implicitly_wait(10) # 全局设置,后续所有元素查找都会遵循这个等待时间 driver.get('URL')
修复后的完整代码
import csv import re from selenium import webdriver from selenium.webdriver.common.by import By # 新增导入By类 from bs4 import BeautifulSoup driver = webdriver.Chrome() driver.implicitly_wait(10) # 全局设置隐式等待 driver.get('URL') username = driver.find_element(By.CSS_SELECTOR, '#email_address') password = driver.find_element(By.CSS_SELECTOR, '#password') username.send_keys('EMAIL') password.send_keys('PASS') login_button = driver.find_element(By.NAME,'login') login_button.click() toggle_button = driver.find_element(By.ID,'toggle_pp2_app_list') if not toggle_button.is_selected(): toggle_button.click() link = driver.find_element(By.LINK_TEXT,'4,766') link.click() link = driver.find_element(By.CLASS_NAME,'appId') link.click() soup = BeautifulSoup(driver.page_source, 'html.parser') links = soup.find_all('a') next_page_link = driver.find_element(By.LINK_TEXT,'Next') next_page_link.click() clean_links = [re.sub(r'\s+', '', link.text.strip()) for link in links] with open('links.csv', 'w', newline='') as f: writer = csv.writer(f) writer.writerow(['Link']) writer.writerows([[link] for link in clean_links]) driver.quit()
内容的提问来源于stack exchange,提问作者mr JK
相关产品推荐
相关产品推荐

