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

