过滤PokeAPI宝可梦招式数据及URLError报错排查
宝可梦PokeAPI数据处理报错排查与修复
报错核心原因
- 变量误用:生成器
__evo_generatortwo里把self.moves当成URL传给request.Request,但self.moves是API返回的字典数据(包含abilities等字段),不是合法URL,导致urllib无法解析,抛出unknown url type错误。 - 函数调用不匹配:主代码调用的是
__evo_generator(move, 'move'),但实际定义的生成器是__evo_generatortwo,而且该生成器没有参数,主代码却传了两个参数,调用逻辑混乱。 - 需求逻辑偏差:当前生成器用
any判断招式是否存在符合条件的学习记录,但你的需求是移除version_group_details中不符合条件的项,不是只筛选存在符合项的招式,逻辑不符。
修复后的代码示例
主逻辑处理(基于已获取的API数据)
# 假设self.moves已经是从API获取的可达鸭完整数据字典 filtered_moves = [] for move_item in self.moves['moves']: # 过滤当前招式的version_group_details,只保留等级学习且等级>0的记录 valid_learn_details = [ detail for detail in move_item['version_group_details'] if detail['level_learned_at'] > 0 and detail['move_learn_method']['name'] == 'level-up' ] if valid_learn_details: # 保留招式信息并替换过滤后的学习记录 cleaned_move = move_item.copy() cleaned_move['version_group_details'] = valid_learn_details filtered_moves.append(cleaned_move) return filtered_moves
完整API请求+处理流程
import urllib.request as request from json import loads def get_golduck_level_up_moves(): # 正确的可达鸭API地址 api_url = "https://pokeapi.co/api/v2/pokemon/golduck/" req = request.Request( api_url, headers={ 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.47 Safari/537.36' } ) with request.urlopen(req) as response: golduck_data = loads(response.read()) filtered_moves = [] for move_entry in golduck_data['moves']: # 过滤符合要求的学习记录 valid_details = [ d for d in move_entry['version_group_details'] if d['level_learned_at'] > 0 and d['move_learn_method']['name'] == 'level-up' ] if valid_details: # 整理成表格需要的格式(可按需调整) table_entry = { '招式名称': move_entry['move']['name'], '学习等级': [d['level_learned_at'] for d in valid_details], '对应版本': [d['version_group']['name'] for d in valid_details] } filtered_moves.append(table_entry) return filtered_moves # 调用示例 level_moves = get_golduck_level_up_moves() for item in level_moves: print(f"{item['招式名称']} | 等级:{item['学习等级']} | 版本:{item['对应版本']}")
关键修复说明
- 明确数据类型:把API返回的字典数据和请求用的URL彻底区分开,请求时必须传入字符串格式的合法URL。
- 统一函数调用:确保调用的函数名和参数定义完全匹配,避免拼写错误或参数不一致问题。
- 修正过滤逻辑:直接遍历
version_group_details列表过滤掉不符合条件的项,而不是仅判断是否存在符合项,这样得到的结果才是符合等级提升招式表格需求的干净数据。
内容的提问来源于stack exchange,提问作者ehrgein
相关产品推荐
相关产品推荐

