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
相关产品推荐
相关产品推荐

