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

在<一些维基百科文章>中有这个奇特的信息框 。 我如何获得<这个领域和那个>的价值?

错误的方法:试图parsingHTML

使用(cURL / jQuery / file_get_contents / requests / wget / more jQuery )来获取文章的HTML文章代码,然后使用DOMparsing器提取table.infobox tr[3] td / 使用正则expression式 。

这在大多数情况下实际上是一个非常糟糕的主意。 维基百科的HTML代码不是特别的parsing友好的(尤其是手写模板系统的信息框),确切的结构从信息框变为信息框,并且信息框的结构可能随着时间而改变。 你也可能会错过一些其他function,比如国际化。

另一个错误的方法是:试图parsingwikitext

乍一看,一些文章的wiki文本看起来像是一个相当简单的信息框表示:

 {{ Infobox Foo | param1 = bar | param2 = 123 ... 

实际上,事实并非如此。 模板是“recursion的”,所以你可能遇到像param1 = {{convert|10|km|mi}} ; 模板参数可能包含复杂的wiki或HTML标记; 文章wikitext中可能会缺less一些参数,并可能会从子页面或其他数据存储库中获取模板。 只要find参数开始和结束的地方,如果它包含具有自己的参数的其他模板,可能不是一个简单的业务。

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

有许多项目以结构化的forms提供维基百科信息框中包含的信息; 两个大的是Wikidata和DBpedia。

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

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

错误的做法是正确的

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

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

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