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

时间:2015-11-23 01:14:13

标签: wikipedia dbpedia wikipedia-api structured-data wikidata

<某些维基百科文章>中有这个花哨的infobox。如何获取<此字段的值以及>?

2 个答案:

答案 0 :(得分:29)

错误的方法:尝试解析HTML

  

使用(cURL / jQuery / file_get_contents / requests / wget / more jQuery)获取文章的HTML文章代码,然后使用DOM解析器提取table.infobox tr[3] td / use a regex

在大多数情况下,这实际上是一个非常糟糕的主意。维基百科的HTML代码不是特别易于解析(特别是信息框,这是一个手写模板系统),确切的结构从信息框改为信息框,信息框的结构可能会随着时间的推移而改变。您可能还会错过其他可用的功能,例如国际化。

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

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

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

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

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

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

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

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

做错了方法

如果您所需的信息无法通过维基数据或DBpedia获得,则仍有半结构化方式从信息框中提取数据。对于基于HTML的提取,您可以使用维基百科的REST content API(例如https://en.wikipedia.org/api/rest_v1/page/html/Albert_Einstein)返回a richer, more semantic HTML而不是普通文章页面上使用的那个,并在其中保留一些有关模板的信息结构

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

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

答案 1 :(得分:0)

接受的答案在所有方面都是正确的,尤其是解析wikitexxt的子文本是可怕的

但是,如果从Wikidata那里获取数据对您而言并不奏效,因为(只是假设)您是试图将数据从WP移至WD的人,我相信这种格式您正在寻找的是 parsetree 。看起来像这样:

<...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 Stra\u00dfe&amp;nbsp;14&lt;br /&gt;&lt;small&gt;ex: Lange Stra\u00dfe&amp;nbsp;89&lt;/small&gt;</value>
   </part>
   <part>
      <name>Date </name>
      <equals>=</equals>
      <value> </value>
   </part>
</template>

Here's an URI通过Mediawiki API Sandbox发出这样的请求。请注意包括 parsetree 的属性列表。为了防万一,我还添加了其他一些类别(包括类别),您可能希望根据实际需要调整列表,以节省时间和其他服务器。