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

如何优雅提取mwparserfromhell返回的嵌套维基链接数据?

问题

我想从mwparserfromhell库返回的维基链接中提取数据,例如解析如下字符串:

[[File:Warszawa, ul. Freta 16 20170516 002.jpg|thumb|upright=1.18|[[Maria Skłodowska-Curie Museum|Birthplace]] of Marie Curie, at 16 Freta Street, in [[Warsaw]], [[Poland]].]]

直接用|分割字符串会失效,因为图片描述中包含使用|的内部链接[[Maria Skłodowska-Curie Museum|Birthplace]]。我目前使用正则先替换所有链接再分割,虽能运行但不够简洁(代码如下),请问是否有更好的提取方法?

import re

wiki_code = "[[File:Warszawa, ul. Freta 16 20170516 002.jpg|thumb|upright=1.18|[[Maria Skłodowska-Curie Museum|Birthplace]] of Marie Curie, at 16 Freta Street, in [[Warsaw]], [[Poland]].]]"

# Remove [[File: at the begining of the string
prefix = "[[File:"
if (wiki_code.startswith(prefix)):
    wiki_code = wiki_code[len(prefix):]

# Remove ]] at the end of the string
suffix = "]]"
if (wiki_code.endswith(suffix)):
    wiki_code = wiki_code[:-len(suffix)]

# Replace links with their
link_pattern = re.compile(r'\[\[.*?\]\]')
matches = link_pattern.findall(wiki_code)
for match in matches:
    content = match[2:-2]
    arr = content.split("|")
    label = arr[-1]
    wiki_code = wiki_code.replace(match, label)

print(wiki_code.split("|"))
解决方案

既然你已经在使用mwparserfromhell,完全可以利用它原生的维基语法解析能力来处理,无需手动写正则和字符串分割,代码更简洁且能正确处理嵌套链接的情况。

示例代码如下:

import mwparserfromhell

wiki_code = "[[File:Warszawa, ul. Freta 16 20170516 002.jpg|thumb|upright=1.18|[[Maria Skłodowska-Curie Museum|Birthplace]] of Marie Curie, at 16 Freta Street, in [[Warsaw]], [[Poland]].]]"

# 解析维基语法字符串
parsed = mwparserfromhell.parse(wiki_code)
# 筛选出所有File类型的维基链接
file_links = parsed.filter_wikilinks(lambda link: link.title.startswith("File:"))

for link in file_links:
    # 拆分File链接的标题部分(文件名+选项)
    title_parts = link.title.split("|")
    filename = title_parts[0].replace("File:", "")
    display_options = title_parts[1:]
    
    # 获取并处理描述文本:自动移除维基语法,保留显示内容
    caption = link.text or ""
    cleaned_caption = mwparserfromhell.parse(caption).strip_code()
    
    # 输出结果
    print("文件名:", filename)
    print("显示选项:", display_options)
    print("处理后描述:", cleaned_caption)

关键说明:

  • mwparserfromhell.parse():将原始维基字符串转换成结构化的语法树,自动处理嵌套的链接、模板等语法
  • filter_wikilinks():精准筛选出File类型的链接,避免处理其他普通内部链接
  • strip_code():一键移除描述文本中的所有维基语法标记(比如把[[X|Y]]转为Y),无需手动替换

这种方法完全依赖库的成熟解析逻辑,避免了正则表达式可能出现的边界错误,代码逻辑更清晰,维护成本更低。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 22:05:32