Python迭代解析JSON时如何过滤相似名称的英超赛事
问题
我写了一段Python代码用来迭代解析JSON API返回的赛事数据,目标只筛选英超(Premier League)赛事,但有些赛事名称类似,比如Premier League 2 (Division 2)和Premier League Cup,导致这些非目标赛事也被纳入结果了。
现有代码:
for event_data in data['events']: if event_data['path'][1]['name'] == 'England' and 'Premier League' in event_data['path'][2]['name'] and 'MATCH' in event_data['tags']: competition = event_data['group'] competition_id = event_data['groupId'] event_id = event_data['id'] event_name = event_data['name'] home_team = event_data['homeName'] away_team = event_data['awayName'] event_start = event_data['start'] event_status = event_data['state'] print(f'{competition} {competition_id} {event_id} {event_name} {event_start} {event_status} {home_team} {away_team}')
代码输出里前两行是不需要的非目标赛事:
Premier League 2 (Division 2) 2000096352 1019103797 Nottingham Forest U21 - Stoke City Reserves 2022-10-17T18:00:00Z NOT_STARTED Nottingham Forest U21 Stoke City Reserves Premier League Cup 2000099592 1019095920 Middlesbrough U21 - West Bromwich Reserves 2022-10-17T17:00:00Z NOT_STARTED Middlesbrough U21 West Bromwich Reserves Premier League 1000094985 1018752216 Brighton & Hove Albion - Nottingham Forest 2022-10-18T18:30:00Z NOT_STARTED Brighton & Hove Albion Nottingham Forest ...(其余有效输出省略)
相关JSON结构特征:
- 英超赛事的
path[2]['name']严格等于Premier League,groupId为1000094985 - 非目标赛事的
path[2]['name']包含额外后缀(如2 (Division 2)、Cup),且groupId与英超不同
现在需要过滤掉这两类非目标赛事。
解决方案
可以通过以下几种可靠方式实现精准筛选:
方法1:精确匹配赛事名称
将原有的包含判断改为精确匹配,直接判断path[2]['name']是否等于Premier League,彻底排除所有带后缀的类似赛事:
for event_data in data['events']: # 修改为精确匹配赛事名称 if event_data['path'][1]['name'] == 'England' and event_data['path'][2]['name'] == 'Premier League' and 'MATCH' in event_data['tags']: competition = event_data['group'] competition_id = event_data['groupId'] event_id = event_data['id'] event_name = event_data['name'] home_team = event_data['homeName'] away_team = event_data['awayName'] event_start = event_data['start'] event_status = event_data['state'] print(f'{competition} {competition_id} {event_id} {event_name} {event_start} {event_status} {home_team} {away_team}')
方法2:通过groupId过滤
利用英超固定的groupId(1000094985)进行筛选,这种方式比名称匹配更稳定,避免赛事名称变更导致的筛选失效:
for event_data in data['events']: # 添加groupId精确匹配条件 if event_data['path'][1]['name'] == 'England' and event_data['groupId'] == 1000094985 and 'MATCH' in event_data['tags']: competition = event_data['group'] competition_id = event_data['groupId'] event_id = event_data['id'] event_name = event_data['name'] home_team = event_data['homeName'] away_team = event_data['awayName'] event_start = event_data['start'] event_status = event_data['state'] print(f'{competition} {competition_id} {event_id} {event_name} {event_start} {event_status} {home_team} {away_team}')
注:如果之前用groupId过滤遇到整数类型问题,检查API返回的
groupId是否为字符串类型,若是则将判断改为event_data['groupId'] == '1000094985'。
方法3:排除特定关键词
如果需要保留其他包含Premier League的赛事,仅排除这两类,可以添加排除条件:
for event_data in data['events']: comp_name = event_data['path'][2]['name'] # 排除带"2"或"Cup"的赛事 if (event_data['path'][1]['name'] == 'England' and 'Premier League' in comp_name and '2' not in comp_name and 'Cup' not in comp_name and 'MATCH' in event_data['tags']): competition = event_data['group'] competition_id = event_data['groupId'] event_id = event_data['id'] event_name = event_data['name'] home_team = event_data['homeName'] away_team = event_data['awayName'] event_start = event_data['start'] event_status = event_data['state'] print(f'{competition} {competition_id} {event_id} {event_name} {event_start} {event_status} {home_team} {away_team}')
内容的提问来源于stack exchange,提问作者DrewS
相关产品推荐
相关产品推荐

