You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 21:12:34