如何在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格式;- 通过
expandtemplatesAPI执行这段自定义Lua代码,绕开了"必须指定模块导出函数"的限制,直接拿到我们需要的结构化数据。
额外注意事项
- 捷克语维基词典原生支持
mw.text.json模块,无需额外配置; - 如果返回的JSON字符串带有多余空白,用
strip()即可快速清理; - 添加
r.raise_for_status()能在API请求失败时直接抛出异常,方便你排查网络或权限问题。
内容的提问来源于stack exchange,提问作者Pux
相关产品推荐
相关产品推荐

