Python爬虫爬取商品价格时字符串转float触发ValueError报错
问题根因
IDE提示if(converted_price < 190):存在冗余括号只是PEP8规范提示,和运行报错无关。
实际触发报错的是价格转换逻辑:你直接截取价格节点文本的前10位做float转换,拿到的是包含换行符、欧元符号、重复价格后缀、以逗号作为小数分隔符的无效字符串\n €203,88€,无法直接转换为浮点数。
除此之外代码还有3个隐性bug:
- 调用了
requests.get()但未导入requests库 - User-Agent使用占位符,会被亚马逊反爬机制拦截,拿不到真实商品页面内容
- Gmail SMTP已不支持直接使用账号密码登录,直接运行发信逻辑会报认证错误
修复步骤
- 补全导入依赖
在代码开头的导入区新增两行:
import requests import re
- 替换错误的价格提取逻辑
删除原代码里的converted_price = float(price[0:10]),替换为带清洗逻辑的代码:
# 先去除价格文本首尾的空白、换行字符 price_clean = price.strip() # 用正则匹配两位小数的价格数字段,适配欧洲站点逗号做小数点的格式 price_match = re.search(r'(\d+,\d{2})', price_clean) if not price_match: raise RuntimeError("未抓取到有效价格,可能是页面结构变更或被反爬拦截") # 将逗号替换为点后转换为浮点数 converted_price = float(price_match.group(1).replace(',', '.'))
- 清理冗余代码
原代码写了两次完全相同的if(converted_price < 190): send_mail()判断,删除其中一处即可;同时可以删掉if条件外的括号,符合Python编码规范,不影响功能运行。 - 替换配置占位符
- 将headers里的
MYUSERAGENT替换为你浏览器真实的User-Agent值 - 将发信配置里的
MYEMAIL、MYPASSWORD替换为真实发信邮箱、Gmail应用专用密码(需先开启谷歌账号两步验证,再生成16位应用专用密码用于SMTP登录)
- 将headers里的
内容的提问来源于stack exchange,提问作者Julia
相关产品推荐
相关产品推荐

