You need to enable JavaScript to run this app. Python开发eBay爬虫生成DataFrame后无法使用价格数值制作可视化图表
优惠活动
大模型
产品
解决方案
定价
更多

Python开发eBay爬虫生成DataFrame后无法使用价格数值制作可视化图表

现有代码的核心问题

你当前生成的DataFrame全为object类型、价格字段无法直接计算,本质是两个环节的疏漏:

  • 爬取阶段没有提取BeautifulSoup节点的文本内容:直接把find()返回的标签对象存入字典,没有取节点内的实际文字内容
  • 价格格式适配问题:西班牙eBay站点的价格使用欧元区本地格式,以逗号作为小数分隔符、带“EUR”文本后缀,没有做格式清洗,无法直接被pandas识别为数值类型。
完整解决步骤

第一步:修正爬取逻辑,提取纯文本

原来的字典里直接塞节点对象的写法,会导致后续清洗根本没有文本可处理,需要在存储时就提取标签内的文字、做空值保护:

productslist = []
results = soup.find_all('div', {'class': 's-item__info clearfix'})
for item in results:
    # 定位节点并做空值判断,避免找不到标签时报错
    title_node = item.find('h3', {'class': 's-item__title'})
    price_node = item.find('span', {'class': 's-item__price'})
    product = {
        'title': title_node.text.strip() if title_node else None,
        'soldprice_raw': price_node.text.strip() if price_node else None
    }
    productslist.append(product)

df = pd.DataFrame(productslist)

这一步执行完,你的soldprice_raw字段就会存和示例一致的文本内容,比如359,00 EUR。

第二步:编写清洗函数,把文本价格转成可计算的数值

针对西班牙站点的价格格式特点做处理,兼容常规标价、区间标价两种场景:

import re
def format_es_price(raw_text):
    # 空值直接返回None
    if not raw_text:
        return None
    # 匹配所有符合"数字,小数"格式的价格片段
    price_matches = re.findall(r'(\d{1,5},\d{2})', raw_text)
    if not price_matches:
        return None
    # 区间价格默认取最低值,也可根据需求取均值
    lowest_price = price_matches[0]
    # 把欧元区格式的逗号小数符替换为Python识别的点号,转成浮点型
    return float(lowest_price.replace(',', '.'))

把函数应用到DataFrame的价格字段上,生成可用于计算、绘图的数值列:

df['soldprice'] = df['soldprice_raw'].apply(format_es_price)
# 查看字段类型,确认soldprice列已经是float类型
print(df.dtypes)
补充注意事项
  • 如果遇到带千位分隔符的高价商品(比如格式为1.299,00 EUR),只需要在函数里加一步去掉所有.的逻辑即可,二手iPhoneX商品一般不会出现这类高价场景
  • 转换后存在空值的行,可以用df = df.dropna(subset=['soldprice'])删除后再做后续的可视化绘图,避免空值干扰图表生成

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.22 19:54:00