为了账号安全,请及时绑定邮箱和手机立即绑定

用 Go 解析维基百科信息框?

用 Go 解析维基百科信息框?

Go
偶然的你 2022-01-04 21:07:21
我正在尝试解析一些维基百科文章的信息框,但似乎无法弄清楚。我已经为 Albert Einstein 下载了文件,我尝试解析 Infobox如下所示:我正在尝试将信息框中的每个项目放入结构或地图中:m["name"] = "Albert Einstein"m["image"] = "Einstein...."......m["death_date"] = "{{Death date and age|df=yes|1955|4|18|1879|3|14}}"......我什至无法隔离信息框。我得到:[[{{Infobox scientist        | name       = Albert Einstein        | image       = Einstein 1921 by F Schmutzer - restoration.jpg        | caption     = Albert Einstein in 1921        | birth_date  = {{Birth date|df=yes|1879|3|14}}]]API 中的 Albert Einstein 条目可以在以下位置找到:https://en.wikipedia.org/w/api.php?action=query&titles=Albert%20Einstein&prop=revisions&rvprop=content&format=json编辑:基于对这个问题的公认答案,我尝试了以下正则表达式:(?=\{Infobox)(\{([^{}]|(?1))*\})但得到:panic: regexp: Compile(`(?=\{Infobox)(\{([^{}]|(?1))*\})`): error parsing regexp: invalid or unsupported Perl syntax: `(?=`编辑 #2:如果有办法通过他们的 API 提取信息,那么我会接受....我一直在阅读文档但找不到它。
查看完整描述

1 回答

?
江户川乱折腾

TA贡献1851条经验 获得超5个赞

我做了一个可能对你有用的正则表达式:

^\s*\|\s*([^\s]+)\s*=\s*(\{\{Plainlist\|(?:\n\s*\*.*)*|.*)

解释

  • 这部分:^\s*\|\s*([^\s]+)\s*=\s*匹配行的开头,例如:

        | <the_label> =
  • 继续在同一行,这部分:(\{\{Plainlist\|(?:\n\s*\*.*)*|.*)将匹配列表:

                         {{Plainlist|
                         * [[Ernst G. Straus]]
                         * [[Nathan Rosen]]
                         * [[Leó Szilárd]]

(请注意,它可能会省略最后的}}。哦,好吧。)

  • 如果没有列表,则匹配到行尾。


查看完整回答
反对 回复 2022-01-04
  • 1 回答
  • 0 关注
  • 122 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信