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

网页抓取中BeautifulSoup出现解包ValueError的原因及咨询

抓取jammer.ie时解包错误的原因分析

问题背景

抓取网站https://jammer.ie时,需求为:

  1. 获取指定URL网页并转换为BeautifulSoup对象
  2. 提取车辆生产年份、发动机信息、价格、经销商信息(若存在)及车辆详情页URL

运行代码时先后出现两个错误:

  • 初始代码用4个变量make, model, year, price解包时,报错:ValueError: not enough values to unpack (expected 4, got 3)
  • 将解包变量改为3个make, model, price后,又报错:too many values to unpack (expected 3)

相关代码如下:

import requests
import pandas as pd
from bs4 import BeautifulSoup


url = "https://jammer.ie/used-cars?page={}&per-page=12"

all_data = []

for page in range(1, 3):  # <-- increase number of pages here
    soup = BeautifulSoup(requests.get(url.format(page)).text, "html.parser")

    for car in soup.select(".car"):
        info = car.select_one(".top-info").get_text(strip=True, separator="|")
        make, model, year, price = info.split("|")
        dealer_name = car.select_one(".dealer-name h6").get_text(
            strip=True, separator=" "
        )
        address = car.select_one(".address").get_text(strip=True)

        features = {}
        for feature in car.select(".car--features li"):
            k = feature.img["src"].split("/")[-1].split(".")[0]
            v = feature.span.text
            features[f"feature_{k}"] = v

        all_data.append(
            {
                "make": make,
                "model": model,
                "year": year,
                "price": price,
                "dealer_name": dealer_name,
                "address": address,
                "url": "https://jammer.ie"
                + car.select_one("a[href*=vehicle]")["href"],
                **features,
            }
        )

df = pd.DataFrame(all_data)
# prints sample data to screen:
print(df.tail().to_markdown(index=False))
# saves all data to CSV
df.to_csv('data.csv', index=False)

错误原因及含义

第一个错误:ValueError: not enough values to unpack (expected 4, got 3)

  • 含义:这个错误表示,你代码里想用4个变量接收info.split("|")拆分后的内容,但实际拆分出来的列表只有3个元素,数量不匹配,导致解包失败。
  • 原因:网页里部分车辆的.top-info区域文本,用|分割后字段数不是4个。比如有些车辆没显示年份,或者文本结构根本不是你预想的「品牌|车型|年份|价格」格式。

第二个错误:too many values to unpack (expected 3)

  • 含义:改成3个变量后,部分车辆的info.split("|")拆分出的元素数量超过3个,没法对应到3个变量,所以还是解包失败。
  • 原因:网页里不同车辆的.top-info文本结构不统一,有的是3个字段,有的是4个甚至更多。比如部分车辆的信息里多了发动机类型之类的字段,导致拆分后元素数超标。

解决思路

  1. 先排查实际文本结构:在解包前打印info和info.split("|"),确认不同车辆的字段数量和具体内容,比如:
    info = car.select_one(".top-info").get_text(strip=True, separator="|")
    print(info, info.split("|"))  # 调试查看实际内容
    
  2. 动态处理字段:不要固定解包变量数量,而是根据拆分后的列表长度分配字段。比如:
    info_parts = info.split("|")
    make = info_parts[0]
    model = info_parts[1]
    # 根据实际结构判断后续字段
    if len(info_parts) >=4:
        year = info_parts[2]
        price = info_parts[3]
    elif len(info_parts) ==3:
        year = None  # 或根据实际情况调整提取逻辑
        price = info_parts[2]
    
  3. 直接定位独立元素:不要依赖整体文本拆分,而是查看网页结构,找到年份、价格对应的单独标签直接提取,避免文本结构不一致的问题。

内容的提问来源于stack exchange,提问作者user14820169

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 20:55:10