Python爬取数据存MySQL遇TypeError:格式字符串参数不足
解决TypeError: not enough arguments for format string问题
问题根源
报错本质是爬取数据的字段数量/格式与CARFINAL表的41个字段不匹配:第4个链接返回的数据字段更少,或者数据中包含未转义的格式化字符(如%),导致SQL插入语句的格式化逻辑失效。
具体解决方案
动态匹配SQL插入字段
不要写死插入的字段列表和占位符,从爬取得到的DataFrame中动态生成,确保字段数量完全匹配:# 假设df是当前链接爬取后的DataFrame insert_cols = ", ".join(df.columns) placeholders = ", ".join(["%s"] * len(df.columns)) sql = f"INSERT INTO CARFINAL ({insert_cols}) VALUES ({placeholders})" # 执行插入时用参数化方式,避免格式化错误 cursor.executemany(sql, df.values.tolist())注意:需确保CARFINAL表包含所有可能出现的字段,且未被插入的字段允许为空或有默认值。
对齐数据与表结构
提前定义CARFINAL表的41个字段,爬取后将DataFrame与表字段强制对齐,缺失字段补充默认值:# 替换为你CARFINAL表的41个实际字段名 carfinal_columns = ["字段1", "字段2", ..., "字段41"] # 重新索引DataFrame,缺失字段填充默认值(None对应SQL的NULL) df = df.reindex(columns=carfinal_columns, fill_value=None) # 生成全字段插入语句 insert_cols = ", ".join(carfinal_columns) placeholders = ", ".join(["%s"] * len(carfinal_columns)) sql = f"INSERT INTO CARFINAL ({insert_cols}) VALUES ({placeholders})" cursor.executemany(sql, df.values.tolist())用参数化查询替代字符串格式化
不要直接用%拼接SQL语句,改用cursor.execute(sql, 参数列表)的方式,MySQL驱动会自动处理数据中的特殊字符(如%、_),彻底避免格式化字符串错误。
排查小技巧
爬取第4个链接后,先打印df.columns和len(df.columns),确认返回的字段数量和名称,对比CARFINAL表的结构,就能快速定位是字段缺失还是特殊字符问题。
内容的提问来源于stack exchange,提问作者Fatih Sarikaya
相关产品推荐
相关产品推荐

