Selenium爬取NettiAuto下拉菜单:品牌正常获取但车型无法获取
解决Nettiauto品牌与车型爬取问题
问题背景
要爬取https://www.nettiauto.com/网站的所有品牌(make)与车型(model)列表,现有Selenium代码可正常获取品牌信息,但无法获取对应车型数据——选择品牌后,车型下拉菜单的选项未正确加载。
核心问题
原代码仅等待车型下拉框存在,但车型选项是品牌选择后通过异步请求动态加载的,未等待选项加载完成就直接获取,导致拿到的还是初始默认选项。
修复后的代码
from selenium import webdriver from selenium.webdriver.chrome.service import Service from webdriver_manager.chrome import ChromeDriverManager from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.support.ui import Select driver = webdriver.Chrome(service=Service(ChromeDriverManager().install())) driver.get("https://www.nettiauto.com/") wait = WebDriverWait(driver, 10) # 等待品牌下拉框可交互 merkki_dropdown = wait.until(EC.element_to_be_clickable((By.XPATH, '//select[@name="make"]'))) select_merkki = Select(merkki_dropdown) # 提前缓存有效品牌选项,避免循环中DOM变化引发异常 brand_options = [opt for opt in select_merkki.options if opt.text.strip() and "Select" not in opt.text.strip()] for merkki_option in brand_options: merkki_name = merkki_option.text.strip() # 选择当前品牌 select_merkki.select_by_visible_text(merkki_name) # 等待车型下拉框可交互,再等待有效车型选项加载完成 model_dropdown = wait.until(EC.element_to_be_clickable((By.XPATH, '//select[@name="model"]'))) wait.until(lambda d: len(d.find_elements(By.XPATH, '//select[@name="model"]/option[text()!="" and not(contains(text(),"Select"))]')) > 0) # 获取最新的车型选项列表 select_model = Select(model_dropdown) model_list = [opt.text.strip() for opt in select_model.options if opt.text.strip() and "Select" not in opt.text.strip()] print(f'Make: {merkki_name}') for model in model_list: print(f' Model: {model}') driver.quit()
关键修改点
- 将品牌下拉框的等待条件改为
element_to_be_clickable,确保交互有效性 - 提前缓存品牌选项,避免循环中DOM更新导致的元素失效异常
- 新增车型选项加载等待逻辑:通过lambda表达式判断有效车型选项是否出现,确保异步加载完成
- 重新实例化车型下拉框的
Select对象,保证获取最新的选项集合
内容的提问来源于stack exchange,提问作者Mansoor
相关产品推荐
相关产品推荐

