You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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加载完成后再抓取:

  1. 先安装依赖:pip install selenium,并下载对应浏览器的驱动(比如ChromeDriver)
  2. 运行以下代码:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 14:15:40