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

如何用Python和BeautifulSoup从网页表格爬取车型款型与价格

爬取CarandDriver网站Hyundai Ioniq 5车型款型与价格的技术指导

需求说明

刚接触编程,需要爬取caranddriver.com网站中Hyundai Ioniq 5页面的车型款型及价格,期望输出格式如下:

SE, $42,000
SEL, $48,000
Limited, $53,000

当前代码问题分析

你提供的代码尝试通过定位<g class="trims">下的<foreignObject>元素提取数据,但大概率无法正常工作,原因可能是:

  • 网站DOM结构已更新,目标元素的标签或类名发生了变化
  • 款型与价格数据是通过JavaScript动态渲染的,直接用requests获取的静态HTML中不存在这些元素

修正方案

方案1:静态HTML爬取(数据存在于静态源码时)

重新分析页面静态HTML结构,更换正确的选择器。以下是调整后的代码:

from bs4 import BeautifulSoup
import requests

# 目标URL
URL = 'https://www.caranddriver.com/hyundai/ioniq-5'

try:
    # 发送请求并获取页面内容
    response = requests.get(URL)
    response.raise_for_status()
    soup = BeautifulSoup(response.text, 'lxml')
    
    # 示例选择器(需根据实际页面结构调整)
    # 假设款型和价格在class为"trim-item"的容器中
    trim_items = soup.find_all('div', class_='trim-item')
    
    for item in trim_items:
        # 提取款型名称并去除多余空格
        trim_name = item.find('h3', class_='trim-name').text.strip()
        # 提取价格并去除多余空格
        trim_price = item.find('span', class_='trim-price').text.strip()
        # 按期望格式输出
        print(f"{trim_name}, {trim_price}")
        
except requests.exceptions.RequestException as e:
    print(f"请求出错: {e}")
except AttributeError:
    print("未找到目标元素,请检查页面结构或选择器是否正确")

方案2:处理动态渲染内容(数据由JS加载时)

如果静态HTML中没有目标数据,说明内容是动态渲染的,需要使用selenium模拟浏览器加载页面:

  1. 先安装selenium:
pip install selenium
  1. 下载对应浏览器的驱动(如ChromeDriver),并配置到环境变量中

  2. 示例代码:

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.caranddriver.com/hyundai/ioniq-5'

# 初始化Chrome浏览器驱动
driver = webdriver.Chrome()
driver.get(URL)

try:
    # 等待目标元素加载完成(最长等待10秒)
    trim_elements = WebDriverWait(driver, 10).until(
        EC.presence_of_all_elements_located((By.CLASS_NAME, 'trim-item'))
    )
    
    for element in trim_elements:
        trim_name = element.find_element(By.CLASS_NAME, 'trim-name').text.strip()
        trim_price = element.find_element(By.CLASS_NAME, 'trim-price').text.strip()
        print(f"{trim_name}, {trim_price}")
        
finally:
    # 关闭浏览器
    driver.quit()

注意事项

  • 网站可能有反爬机制,爬取时需控制请求频率,避免IP被封禁
  • 定期检查页面结构,若网站更新DOM,需同步调整选择器

内容的提问来源于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 08:24:20