解决'dict' object has no attribute 'loads'错误及flucs数据提取问题
问题分析与解决方案
看起来你碰到了两个问题:一是代码抛出的AttributeError错误,二是如何正确提取flucs里的最后两条无时间戳数据并追加它们。让我一步步帮你搞定:
先解决你的错误:AttributeError: 'dict' object has no attribute 'loads'
这个错误的核心原因是你调用.loads()的对象是一个字典,而不是json模块。结合你贴的代码来看,有两个明确的诱因:
- 语法错误:
requests.get()的调用没有闭合括号,导致Python解析器混乱,错误地把json识别成了某个字典变量,而非你导入的json模块。 - 变量遍历逻辑错误:你用
for fluc in selection['flucs']遍历字符串,会把flucs拆成单个字符处理,这完全不符合解析JSON字符串的需求。
实现你的核心需求:提取最后两条数据、追加、去除时间戳
你的目标很明确:从flucs的时间戳-赔率列表里,取出最后两个赔率值(去掉时间戳),并把这些值统一追加起来。下面是修正后的完整代码,附带详细注释:
import requests import json # 修正:补上requests.get()的闭合括号,同时把URL里的&转成&(避免请求参数解析错误) request2 = requests.get( 'https://www.punters.com.au/api/web/public/Odds/getOddsComparisonCacheable/?allowGet=true&APIKey=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX&eventId=1044547&betType=FixedWin', headers={'User-Agent': 'Mozilla/5.0'} ) json2 = request2.json() # 用来存储所有提取到的最后两条赔率数据 collected_odds = [] for selection in json2['selections']: # 直接把flucs的JSON字符串解析成Python列表,不需要遍历字符串 flucs_data = json.loads(selection['flucs']) # 先判断数据条数是否足够,避免索引越界错误 if len(flucs_data) >= 2: # 取倒数第二个和最后一个元素,提取它们的第二个值(即赔率,跳过时间戳) second_last_odd = flucs_data[-2][1] last_odd = flucs_data[-1][1] # 追加到收集列表中 collected_odds.append(second_last_odd) collected_odds.append(last_odd) # 打印当前选项的结果,方便验证 print(f"[{selection['name']}] 倒数第二条赔率:{second_last_odd},最后一条赔率:{last_odd}") else: print(f"[{selection['name']}] 的flucs数据不足2条,跳过处理") # 输出所有收集到的最终结果 print("\n所有提取的最后两条赔率数据:", collected_odds)
关键细节说明:
- 修正请求合法性:不仅补上了
requests.get()的闭合括号,还修复了URL里的HTML转义字符&为标准的&,避免请求时参数解析失败。 - 正确解析flucs:
selection['flucs']是一个完整的JSON字符串,直接用json.loads()解析成列表即可,不需要遍历字符串的单个字符。 - 避免索引越界:加入
len(flucs_data) >= 2的判断,防止某些选项的flucs数据过少导致报错。 - 精准提取目标值:用
flucs_data[-2][1]和flucs_data[-1][1]直接定位到倒数第二、最后一个元素的赔率值(跳过第一个位置的时间戳)。 - 统一追加数据:把所有提取到的赔率值追加到
collected_odds列表中,方便后续的存储或进一步处理。
内容的提问来源于stack exchange,提问作者onthepunt3
相关产品推荐
相关产品推荐

