Discord Bot调用MyAnimeList API出现TypeError问题求助
解决Discord机器人/anime命令的TypeError问题
嘿,我来帮你拆解这个问题并给出可行的解决方案~
首先明确问题根源:不是randrange()的问题,你遇到的TypeError: 'NoneType' object is not subscriptable,是因为你使用的mal-api库内部在解析MyAnimeList页面时,找不到og:title这个meta标签,导致soup.find()返回了None,随后代码直接尝试对None执行['content']下标操作,才触发了错误。
下面是几个针对性的解决办法:
1. 给mal库打个小补丁(最直接的临时修复)
找到你安装的mal库中的mal.py文件,定位到报错的第15行,原来的代码大概是这样的:
title = soup.find('meta', property='og:title')['content']
修改成带判断的版本,避免对None操作:
meta_title = soup.find('meta', property='og:title') if not meta_title: # 抛出异常让上层逻辑处理,或者返回默认值 raise ValueError("目标动漫页面未找到og:title标签") title = meta_title['content']
修改后,当遇到没有该标签的页面时,会抛出明确的异常,而不是直接崩溃。
2. 更换更稳定的MyAnimeList API库(长期最优解)
你当前用的库是通过爬取网页HTML来获取数据的,很容易受页面结构更新影响。推荐换成jikanpy——它基于Jikan API(MyAnimeList官方认可的第三方数据接口),直接返回JSON数据,完全不需要解析HTML,稳定性高很多。
示例代码:
from jikanpy import Jikan import random def fetch_random_anime_url(): jikan = Jikan() while True: try: anime_id = random.randint(1, 40500) anime_data = jikan.anime(anime_id) return anime_data['url'] # 直接从JSON中取URL except Exception as e: # 捕获不存在的ID、请求超时等异常,自动重试 continue
3. 在你的主逻辑中捕获该TypeError(快速兼容)
如果暂时不想修改库代码或换库,可以在调用mal库的地方,把TypeError和原本的404错误一起捕获,让循环自动重试:
import mal import random def get_random_anime(): while True: try: anime_id = random.randrange(1, 40500) target_anime = mal.Anime(anime_id) return target_anime.url except (mal.NotFoundError, TypeError) as e: # 遇到404或标签缺失的情况,直接重试下一个ID continue
补充说明
出现这个问题的核心原因是:部分动漫ID对应的页面,要么被删除、要么页面结构和库预期的不一致,导致og:title标签缺失。你的随机ID逻辑本身没问题,只是库的健壮性不足,没有处理标签不存在的情况。
内容的提问来源于stack exchange,提问作者Paloys
相关产品推荐
相关产品推荐

