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

如何在Python中获取无调用函数的Scribunto模块返回值?

解决捷克语维基词典Languages模块数据获取问题

首先得明确核心问题:你尝试调用的捷克语Modul:Languages模块直接返回了一个Lua表,没有对外导出可调用的函数,而MediaWiki的#invoke语法必须指定要调用的函数名,这就是你收到"必须指定要调用的函数"错误的原因。

解决方案:通过内嵌Lua代码序列化模块返回值

我们可以借助MediaWiki的{{#lua:}}语法,直接加载目标模块并将其返回的Lua表序列化为JSON格式,这样就能通过expandtemplates API获取到结构化数据了。

修改你的Python代码如下:

import requests
import json

def expand_template(sub_domain: str, text: str) -> str:
    params = {
        "action": "expandtemplates",
        "format": "json",
        "text": text,
        "prop": "wikitext",
        "formatversion": "2",
    }
    r = requests.get(f"https://{sub_domain}.wiktionary.org/w/api.php",
                     params=params)
    r.raise_for_status()  # 新增:处理请求错误,方便排查问题
    data = r.json()
    return data["expandtemplates"]["wikitext"]

def get_cs_languages():
    # 自定义Lua代码:加载模块并序列化为JSON
    lua_code = """
{{#lua:
local Languages = require('Module:Languages')
local json = require('mw.text.json')
-- 序列化Lua表为JSON字符串
return json.encode(Languages)
}}
"""
    json_text = expand_template("cs", lua_code.strip())
    # 解析JSON数据为Python字典
    lang_data = json.loads(json_text)
    
    # 这里可以添加你的数据处理/保存逻辑
    print("成功获取语言数据,示例条目:", next(iter(lang_data.items())))
    # save_json_file(lang_data, "cs")

if __name__ == "__main__":
    get_cs_languages()

为什么这个方法有效?

  • require('Module:Languages')会加载目标模块并获取它返回的完整Lua表;
  • mw.text.json.encode()是MediaWiki内置的安全序列化函数,能把Lua表转换成标准JSON格式;
  • 通过expandtemplates API执行这段自定义Lua代码,绕开了"必须指定模块导出函数"的限制,直接拿到我们需要的结构化数据。

额外注意事项

  1. 捷克语维基词典原生支持mw.text.json模块,无需额外配置;
  2. 如果返回的JSON字符串带有多余空白,用strip()即可快速清理;
  3. 添加r.raise_for_status()能在API请求失败时直接抛出异常,方便你排查网络或权限问题。

内容的提问来源于stack exchange,提问作者Pux

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 10:05:27