Streamlit线上应用报TypeError本地正常,求解决方案
问题分析与修复方案
错误根源
报错栈指向create_df函数第213行的求和逻辑:
res['Total'] = res.drop(['Ingredients', 'Measurement'], axis=1).sum(axis=1)
TypeError: can only concatenate str (not "float") to str说明待求和的列中混入了字符串类型数据,导致pandas无法正常执行数值求和。结合本地正常、线上报错的情况,大概率是两个原因:
- 线上环境依赖版本(比如pandas)和本地不一致,新版本pandas对类型校验更严格;
- Hellofresh网页结构更新,爬取到的配料数量字段不再是纯数字(比如带单位、空值或其他文本)。
修复步骤
1. 强制转换求和列的数值类型
在求和前批量将目标列转为数值型,无法转换的内容设为NaN:
import pandas as pd # 筛选出需要求和的列(排除非数值列) sum_columns = res.columns.difference(['Ingredients', 'Measurement']) # 批量转换为数值类型,错误值转为NaN res[sum_columns] = res[sum_columns].apply(pd.to_numeric, errors='coerce') # 计算Total列,跳过空值 res['Total'] = res[sum_columns].sum(axis=1, skipna=True)
2. 校验并清理爬取数据
检查Hellofresh网页是否更新,若爬取到的数量字段带单位(如"500g"、"2个"),提前提取数字部分:
# 假设数量字段名为'Quantity',提取数字内容 res['Quantity'] = res['Quantity'].str.extract(r'(\d+\.?\d*)', expand=False)
3. 对齐本地与线上依赖版本
把本地环境的依赖版本导出到requirements.txt,强制线上使用相同版本:
# 本地终端执行 pip freeze > requirements.txt
确保部署时安装的pandas、streamlit等包版本和本地完全一致。
4. 增加单URL异常处理
处理多URL时,对每个URL单独捕获异常,避免单个URL的数据问题导致整个流程崩溃:
def process_single_url(url): try: # 这里放单个URL的爬取、解析逻辑 return parsed_data except Exception as e: print(f"处理URL {url} 失败: {str(e)}") return None # 批量处理时过滤异常结果 valid_records = [data for data in map(process_single_url, url_list) if data is not None]
内容的提问来源于stack exchange,提问作者June Smith
相关产品推荐
相关产品推荐

