使用BeautifulSoup抓取汽车OEM厂商下拉选项的技术求助
解决方法
你的代码只输出“Make”是因为页面的汽车厂商选项是通过JavaScript动态加载的,用requests获取的静态HTML里只有第一个默认选项,其余选项还没渲染出来。下面提供两种可行的解决方案:
方法一:直接调用API接口(推荐)
通过抓包可以找到页面加载厂商数据的API接口,直接请求接口获取数据,效率更高:
import requests # 请求厂商数据的API接口 api_url = "https://www.motortrend.com/api/v1/vehicles/makes?year=2025&sort=name" response = requests.get(api_url) response.raise_for_status() # 解析JSON数据并输出厂商名称 makes_data = response.json() for make in makes_data: print(make["name"])
方法二:用Selenium模拟浏览器加载
如果不想找API,用Selenium模拟浏览器打开页面,等待JS加载完成后再抓取:
- 先安装依赖:
pip install selenium,并下载对应浏览器的驱动(比如ChromeDriver) - 运行以下代码:
from bs4 import BeautifulSoup 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 URL = "https://www.motortrend.com/cars/" # 初始化浏览器(这里以Chrome为例) driver = webdriver.Chrome() driver.get(URL) try: # 等待厂商下拉框加载完成 select_element = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.ID, "make")) ) # 获取加载完成后的页面源码 page_source = driver.page_source soup = BeautifulSoup(page_source, "lxml") # 定位目标下拉框并获取选项 select_tag = soup.find("select", id="make") options = select_tag.find_all("option") # 跳过第一个"Make"选项,输出其余厂商 for option in options[1:]: print(option.text.strip()) finally: # 关闭浏览器 driver.quit()
补充说明
- 方法一无需模拟浏览器,速度快,是最优解;
- 方法二适合处理复杂动态渲染的页面,但需要额外配置浏览器驱动;
- 原代码的核心问题是静态HTML中没有动态加载的选项,必须处理JS渲染的内容。
内容的提问来源于stack exchange,提问作者JAA
相关产品推荐
相关产品推荐

