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



<维基百科上的一些文章>。如何获得<这个领域和那个领域>?

错误的方法:尝试解析HTML

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

在大多数情况下,这实际上是一个非常糟糕的主意。维基百科的HTML代码对解析不是特别友好(尤其是infobox,这是一个手写模板系统),确切的结构会随着infobox的变化而变化,infobox的结构可能会随着时间的推移而变化。您还可能会错过一些原本可以使用的功能,例如国际化。

另一种错误的方法:尝试解析wikitext

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

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

事实并非如此。模板是";递归的";所以你可能会遇到像param1 = {{convert|10|km|mi}}这样的东西;模板参数可能包含复杂的wikitext或HTML标记;文章wikitext中可能缺少一些参数,这些参数是由模板从子页面或其他数据存储库中获取的。如果参数包含其他有自己参数的模板,那么仅仅找出参数的起点和终点可能不是一件简单的事情。

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

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

Wikidata是一个建立包含结构化数据的知识库的项目;它是由建立维基百科的同一个全球运动维护的,因此信息正在被转移。这是一个手动过程,所以并非维基百科中的所有信息都可以通过维基数据获得,另一方面,有很多信息在维基数据中,但不在维基百科中。您可以找到文章的Wikidata页面,并按照文章页面左侧工具栏中的Wikidata项目链接查看其中包含的信息;通过编程,您可以使用wbgetentities API模块(沙箱,概念解释)访问Wikidata信息,例如Wikidata.org/w/API.php?action=wbgetentities&sites=enwiki&title=阿尔伯特·爱因斯坦。还有一个SPARQL端点、数据库转储以及PHP、Java和Python中的客户端。

DBPedia是一个通过自动化方式获取维基百科信息框信息并以结构化形式发布的项目。您可以通过访问http://dbpedia.org/page/<Wikipedia article name>找到维基百科文章的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更丰富、更语义的HTML,并在其中保留了一些关于模板结构的信息。

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

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

公认的答案在所有方面都是正确的,尤其是解析wikitext的潜台词是可怕的

然而,如果从Wikidata获取数据对你来说不太有效,因为(只是假设)你是试图将数据从WP移动到WD的人,我相信你要寻找的格式是解析树。以下是它的样子:

<...lots of other stuff omitted>
<template lineStart= "1">
   <title>Datatable TableRow</title>
   <part>
      <name>Picture         </name>
      <equals>=</equals>
      <value> Picture 2013-07-26.jpg</value>
   </part>
   <part>
      <name>Inscription    </name>
      <equals>=</equals>
      <value> This is an Inscription on visible on the image</value>
   </part>
   <part>
      <name>NS           </name>
      <equals>=</equals>
      <value> 54.0902049</value>
   </part>
   <part>
      <name>EW           </name>
      <equals>=</equals>
      <value> 12.1364164</value>
   </part>
   <part>
      <name>Region       </name>
      <equals>=</equals>
      <value> DE-MV</value>
   </part>
   <part>
      <name>Name         </name>
      <equals>=</equals>
      <value> Person, Anna</value>
   </part>
   <part>
      <name>Location          </name>
      <equals>=</equals>
      <value> Lange Strau00dfe&amp;nbsp;14&lt;br /&gt;&lt;small&gt;ex: Lange Strau00dfe&amp;nbsp;89&lt;/small&gt;</value>
   </part>
   <part>
      <name>Date </name>
      <equals>=</equals>
      <value> </value>
   </part>
</template>

这是一个使用Mediawikineneneba API沙盒的请求的URI。请注意包含解析树的属性列表。我已经包含了一些其他类别(包括类别)以防万一,您可能想根据实际需要调整列表,以节省您的时间和其他人的服务器。

最新更新