如何将MediaWiki API返回的Wikitext内容转为JSON或高效解析?
能否直接获取JSON/结构化格式?
- 直接通过
prop=revisions获取JSON格式的页面内容是不可行的,rvprop=content返回的始终是原始Wikitext。但有两种替代方式可以获取结构化数据:- 使用
action=parse接口:将Wikitext解析为包含HTML、章节结构、页面属性的结构化响应,请求示例:
该接口返回的是解析后的页面结构,但不会直接提取出卡牌属性这类业务字段。http://yugioh.wikia.com/api.php?action=parse&page=Red_Dragon_Archfiend&format=json&prop=html|sections|properties - 提取模板参数:游戏王维基的卡牌页面基本都基于统一模板构建,可通过两步获取模板的结构化键值对:
- 第一步,获取页面使用的模板列表:
http://yugioh.wikia.com/api.php?action=query&prop=templates&titles=Red_Dragon_Archfiend&format=json - 第二步,提取目标模板的参数:
http://yugioh.wikia.com/api.php?action=parse&page=Red_Dragon_Archfiend&format=json&prop=templateargs
- 第一步,获取页面使用的模板列表:
- 使用
高效解析Wikitext的最优方案
如果上述结构化获取方式无法满足需求,需要直接解析Wikitext,推荐以下方案:
- 使用官方生态的解析库:
- Python环境优先用
mwparserfromhell,这是专门为MediaWiki Wikitext设计的解析库,支持模板提取、内容修改等操作,示例代码:import mwparserfromhell import requests # 发起API请求获取Wikitext api_url = "http://yugioh.wikia.com/api.php?action=query&prop=revisions&rvprop=content&format=json&titles=Red_Dragon_Archfiend" resp = requests.get(api_url).json() page_key = next(k for k in resp['query']['pages'] if k != '-1') wikitext = resp['query']['pages'][page_key]['revisions'][0]['*'] # 解析并提取模板参数 parsed_wikitext = mwparserfromhell.parse(wikitext) card_template = parsed_wikitext.filter_templates()[0] atk = card_template.get('atk').value.strip() race = card_template.get('race').value.strip() print(f"攻击力: {atk}, 种族: {race}") - JavaScript环境可以用
mediawiki-wikitext-parser,支持在Node.js或浏览器中解析Wikitext。
- Python环境优先用
- 正则表达式(仅限固定结构场景):如果页面Wikitext格式完全固定,可用正则快速提取特定字段,但要注意格式变体可能导致解析失败,仅作为临时方案,示例:
import re atk_match = re.search(r'\|atk\s*=\s*(\d+)', wikitext) if atk_match: print(f"攻击力: {atk_match.group(1)}")
内容的提问来源于stack exchange,提问作者RatlingRat
相关产品推荐
相关产品推荐

