如何解析Wikitext维基文本并提取所需目标数据
Wikitext解析与数据提取实现方案
针对从维基百科原始Wikitext中提取指定数据的需求,按实现成本从低到高,有三类可直接落地的方案,可根据自身业务场景选择:
- 固定目标轻量提取:定向正则匹配
如果你只需要提取少量位置固定的内容(比如示例里的Infobox字段、指定章节下的列表),不需要兼容所有Wikitext复杂语法,直接写针对性正则是成本最低的方案,处理单页面小批量数据的时候效率很高。
比如示例里Infobox的字段统一是| 字段名 = 字段值的行结构,写对应正则匹配目标行即可,提取到内容后做简单清洗:去掉[[页面链接]]的双层方括号标记、按需处理{{模板}}类标记、转义<这类HTML实体就能用。
注意:别尝试写兼容所有Wikitext场景的万能正则,Wikitext嵌套规则非常灵活,万能正则的匹配错误率极高,只针对你当前要处理的固定结构写规则就行。 - 通用批量解析场景:使用成熟开源Wikitext解析库
如果你需要处理大量页面、提取的内容类型不固定,直接用现成解析库把Wikitext解析成抽象语法树(AST),再按节点类型筛选提取内容即可,不用自己从头实现语法解析逻辑:- Python环境优先选
mwparserfromhell,是维基媒体生态广泛使用的解析库,对各类Wikitext语法兼容性很好,支持直接筛选模板、模板参数、章节、列表、链接等节点。
针对给出的Blue Air示例内容,简单提取代码参考:import mwparserfromhell # 传入存储的原始Wikitext字符串完成解析 parsed_wiki = mwparserfromhell.parse(your_wikitext_string) # 定位到Infobox airline模板 airline_infobox = parsed_wiki.filter_templates(matches="Infobox airline")[0] # 提取指定字段值 iata_code = airline_infobox.get("IATA").value.strip() fleet_count = airline_infobox.get("fleet_size").value.strip() # 提取Codeshare agreements章节下的航司列表 codeshare_section = parsed_wiki.get_sections(matches="Codeshare agreements")[0] codeshare_airlines = [link.text.strip_code() for link in codeshare_section.filter_wikilinks()] - JS/TS环境可以选用
wikiparser-node,语法支持度完善,使用逻辑和上述Python库一致,解析为AST后按节点规则提取即可。
- Python环境优先选
- 低代码场景:直接取用维基百科的结构化接口数据
如果你要提取的是维基百科条目内的通用结构化内容(比如Infobox信息、章节内容、关联链接),不需要自己拉取raw格式的原始Wikitext做解析,可以直接调用维基百科官方提供的REST类接口,拿到已经完成初步清洗的结构化数据,直接读取对应字段即可,能省掉90%以上的解析、清洗工作量。
内容的提问来源于stack exchange,提问作者hanushi-thana
相关产品推荐
相关产品推荐

