开发Anki插件调用getNote时触发NotFoundError错误如何解决
错误触发原因
mw.col.find_cards() 返回的是卡片ID(cid),而mw.col.getNote() 方法要求传入的参数是笔记ID(nid),两类ID体系完全独立不互通,传入非笔记ID的参数时,后端就会抛出NotFoundError。
同时标签是直接关联到笔记实体的,使用find_cards搜索标签本身也属于冗余操作。
修复方案
将搜索卡片的逻辑替换为搜索笔记,直接获取符合条件的笔记ID即可,修改testFunction代码如下:
def testFunction() -> None: # 替换find_cards为find_notes,直接获取笔记ID note_ids = mw.col.find_notes("tag:jpzr") for nid in note_ids: note = mw.col.getNote(nid) # 判空避免无效请求 if not note["Focus"].strip(): continue meaning_list = return_search(note["Focus"]) # 如需避免重复写入可先清空原有内容:note["Meaning"] = "" note["Meaning"] += meaning_list note.flush()
如果业务场景确实需要先检索卡片,再获取对应笔记,也可以通过卡片对象的nid属性拿到对应笔记ID:
def testFunction() -> None: card_ids = mw.col.find_cards("tag:jpzr") for cid in card_ids: card = mw.col.getCard(cid) note = mw.col.getNote(card.nid) # 后续逻辑不变
额外优化建议
- 给
requests.get添加timeout参数,同时捕获网络请求异常,避免访问Jisho失败时插件直接崩溃 - 批量查询时添加1-2秒的请求间隔,避免触发Jisho的反爬机制被限制IP
- 写入字段前校验笔记是否存在
Focus和Meaning字段,兼容不同笔记类型的情况
内容的提问来源于stack exchange,提问作者Aaron Green
相关产品推荐
相关产品推荐

