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

Python合并两字典列表生成pandas数据 解决价格迭代问题

解决方案

问题原因

你之前代码运行后所有商品价格相同,核心原因是循环中写死了价格取值price3[0-17],没有跟随循环进度匹配对应下标的价格,导致所有条目都取到了同一个固定价格值。

方法1:直接合并已有的两个等长列表

如果你已经拿到了长度均为16的SoapName和SoapPrices列表,用zip函数按下标一一配对即可,生成的结果可以直接导入pandas:

import pandas as pd

all_soap = []
# zip按顺序配对两个列表同位置的元素
for name_entry, price_entry in zip(SoapName, SoapPrices):
    all_soap.append({
        "title": name_entry["title"],
        "price": price_entry["price"]
    })

# 直接生成DataFrame
soap_df = pd.DataFrame(all_soap)

注意:这种写法要求两个列表长度完全一致、同位置元素确实对应同一个商品,否则会出现数据错位。

方法2:爬虫阶段直接配对数据(更稳妥)

分开抓取所有标题、所有价格再匹配的逻辑,很容易因为页面元素缺失导致两个列表长度不一致、数据错位。更推荐的写法是先定位每个商品的外层父容器,在单个容器内分别抓取当前商品的标题和价格,从根源避免匹配错误:

import pandas as pd

all_soap = []
# 先定位页面上每个独立商品的外层容器,class替换为你页面实际的商品卡片类名
product_cards = soup.find_all("div", class_="product-item-card")

for card in product_cards:
    # 单个商品容器内抓取标题
    title = card.find("h1", class_="product_title entry-title elementor-heading-title elementor-size-default").a.text.strip()
    # 同一个容器内抓取对应价格,class替换为你页面实际的价格标签类名
    price = float(card.find("span", class_="woocommerce-Price-amount").text.strip())
    all_soap.append({"title": title, "price": price})

soap_df = pd.DataFrame(all_soap)

方法3:保留原有分开抓取逻辑的修正写法

如果你不想调整现有爬取逻辑,只需要在循环时加入索引,按当前循环的下标取对应位置的价格即可,不要写死取值位置:

all_soap = []
soapinformation = soup.find_all("h1", class_= "product_title entry-title elementor-heading-title elementor-size-default")

# enumerate获取当前循环的下标idx
for idx, soap in enumerate(soapinformation):
    soapTitle = soap.find("a").text.strip()
    # 用下标取对应位置的价格
    soapPrice = SoapPrices[idx]["price"]
    all_soap.append({"title": soapTitle, "price": soapPrice})

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 08:54:19