如何从维基百科信息框中提取信息?

Tgr*_*Tgr 18 wikipedia structured-data wikipedia-api dbpedia wikidata

在<some Wikipedia article>中有这个花哨的信息框.如何获得<this field and that>的值?

Tgr*_*Tgr 31

错误的方法:尝试解析HTML

使用(卷曲/ jQuery的/的file_get_contents /请求/ wget的/ 更多的jQuery)来获取文章的HTML代码的文章,然后使用DOM解析器来提取table.infobox tr[3] td/ 使用正则表达式.

这在大多数情况下实际上是一个非常糟糕的主意.维基百科的HTML代码没有特别解析友好(尤其是InfoBoxes到它们的手写教案系统),精确的结构发生变化,从信息框,以信息框和信息框的结构可能会随时间而改变.您可能还会错过其他可用的功能,例如国际化.

另一种错误方式:尝试解析wiki文本

一目了然,一些文章的wikitext看起来像是一个非常简单的信息框表示:

{{ Infobox Foo
| param1 = bar
| param2 = 123
...
Run Code Online (Sandbox Code Playgroud)

实际上,情况并非如此.模板是"递归的",所以你可能遇到像这样的东西param1 = {{convert|10|km|mi}}; 模板参数可能包含复杂的wiki文本或HTML标记; 文章wikitext中可能缺少某些参数,并且模板从子页面或其他数据存储库中提取这些参数.如果参数包含具有自己参数的其他模板,那么找出参数的开始和结束位置可能不是一项简单的业务.

理想的方式:使用结构化数据源

有各种项目以结构化的形式提供维基百科信息框中包含的信息; 两个大的是维基数据和DBpedia.

维基数据是一个构建包含结构化数据的知识库的项目; 它由构建维基百科的同一个全球运动维护,因此信息正在被移动.这是一个手动过程,因此并非维基百科中的所有信息都可通过维基数据获得,另一方面,维基百科中有很多信息,但维基百科中没有这些信息.您可以通过文章页面左侧工具栏中的维基数据项目链接找到文章的维基数据页面并查看其中包含的信息; 以编程方式,您可以使用wbgetentities API模块(沙箱,概念说明)访问维基数据信息,例如wikidata.org/w/api.php?action=wbgetentities&sites=enwiki&titles=Albert_Einstein.还有PHP,JavaPython中SPARQL端点,数据库转储和客户端.

DBPedia是一个通过自动化方式收集维基百科信息框信息并以结构化形式发布的项目.您可以通过找到一个维基百科文章的DBpedia的页面http://dbpedia.org/page/<Wikipedia article name>,如http://dbpedia.org/page/Albert_Einstein.它有许多数据格式,转储,SPARQL端点各种其他东西.

做错了方法

如果您需要的信息不能通过维基数据或DBpedia获得,那么仍然存在从信息框中提取数据的半结构化方法.对于基于HTML的提取,您可以使用Wikipedia的REST内容API(例如https://en.wikipedia.org/api/rest_v1/page/html/Albert_Einstein),它返回比普通文章页面上使用的更丰富,更语义的HTML.,并在其中保留一些有关模板结构的信息.

或者,您可以从wikitext开始,使用更简单的客户端mwparserfromhellPython模块(docs)或与Wikipedia REST内容服务交互的功能更强大的Parsoid JS API将其解析为语法树.

试图从wikitext中提取信息框内容的高级Python库是wptools.

  • @Alex取决于您的使用案例.DBPedia往往更完整; 维基数据往往更深入,更具语义性. (2认同)