NBA数据爬取时字符串转int报ValueError: invalid literal for int()错误求助
问题排查与修复方案
核心报错原因
- 判断逻辑完全错误:你写的
if('data-stat="visitor_pts"')这类判断永远为真,因为Python中非空字符串的布尔值都是True,和当前row是否包含对应字段没有任何关系。循环遍历rows时,只要遇到不包含得分字段的行,partition方法提取到的结果就会是空字符串'',这就是你报错invalid literal for int() with base 10: ''的来源。你看到打印出来的得分正常,只是因为部分行确实包含对应字段,循环到无对应字段的行时才会触发报错。 - 缺少类型转换与空值校验:你当前代码直接对字符串类型的得分做大小比较和减法运算,就算没有空值也会抛出类型错误。
修复步骤
- 修正所有条件判断,先校验当前行是否包含所需的全部字段,不包含就直接跳过
- 提取得分后先去除首尾空白字符,再做非空校验和整数类型转换
- 增加异常捕获逻辑兼容异常格式的行
修改后代码示例
for row in rows: row_str = str(row) # 校验当前行是否包含所有需要的字段,不包含直接跳过 required_keys = [ 'data-stat="visitor_team_name"', 'data-stat="home_team_name"', 'data-stat="visitor_pts"', 'data-stat="home_pts"' ] if not all(key in row_str for key in required_keys): continue # 提取球队信息 away_team = row_str.partition('data-stat="visitor_team_name">')[2].partition("</a")[0].partition('.html">')[2] print(f"Away Team: {away_team}") home_team = row_str.partition('data-stat="home_team_name">')[2].partition("</a")[0].partition('.html">')[2] print(f"Home Team: {home_team}") # 提取得分并去除首尾空白 away_pts_str = row_str.partition('data-stat="visitor_pts">')[2].partition("<")[0].strip() home_pts_str = row_str.partition('data-stat="home_pts">')[2].partition("<")[0].strip() print(f"Away points: {away_pts_str}") print(f"Home points: {home_pts_str}") # 安全转换为整数 try: away_pts = int(away_pts_str) home_pts = int(home_pts_str) except ValueError: print(f"当前行得分格式异常,已跳过,客场得分值:{repr(away_pts_str)},主场得分值:{repr(home_pts_str)}") continue # 计算分差与胜者 if away_pts > home_pts: point_diff = away_pts - home_pts winner = away_team else: point_diff = home_pts - away_pts winner = home_team print(f"分差:{point_diff},获胜队伍:{winner}")
内容的提问来源于stack exchange,提问作者adcoder
相关产品推荐
相关产品推荐

