【问题标题】:How to extract information from a Wikipedia infobox?如何从维基百科信息框中提取信息?
【发布时间】:2016-02-25 01:05:21
【问题描述】:

中有这个花哨的infobox。如何获取 的值?

【问题讨论】:

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


【解决方案1】:

错误的方式:试图解析 HTML

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

在大多数情况下,这实际上是一个非常糟糕的主意。 Wikipedia 的 HTML 代码对解析不是特别友好(尤其是作为手写模板系统的信息框),信息框的确切结构会随着信息框的变化而变化,并且信息框的结构可能会随着时间而改变。您可能还会错过一些原本可用的功能,例如国际化。

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

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

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

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

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

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

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

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

错误的方法做对了

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

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

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

【讨论】:

  • 我可以使用 SPARQL wikidata 或 DBPedia?哪个更适合获取维基百科数据?
  • @Alex 取决于您的用例。 DBPedia 往往更完整;维基数据往往更深入、更语义化。
  • 我不确定这是否是一种理想的方式,你得到的结果比自己解析的要少,即使你自己解析的时间更长,因为 dpedia ok 可以给你日期,但很多时候都错过了整个日期,例如这里没有日期dbpedia.org/page/Victory_Tests 的年份,而实际的维基百科页面也有年份en.wikipedia.org/wiki/Victory_Tests 所以不知道,它更长,但手动解析更好
  • 另外请记住,DBPedia 并没有与 Wikipedia 实时同步,您可能会遇到 wikipedia 版本和 DBPedia 中相应条目之间的几个月延迟。
  • 我敢打赌,得到这个答案的人中大约有一半是在尝试解析维基百科,以将数据添加到维基数据中。
【解决方案2】:

接受的答案在所有方面都是正确的,尤其是解析 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 沙盒处理此类请求。请注意包含 parsetree 的属性列表。为了以防万一,我添加了一些其他类别(包括 categories),您可能希望将列表修剪为您实际需要的内容,以节省您的时间和其他人的服务器。

【讨论】:

  • 解析树绝对有用,但不能解决以下问题:1)信息框参数可能是模板本身(单位转换、日期数学、多行格式等)2)信息的一部分可能来自其他地方(例如,城市信息框经常使用存储在不同 wiki 页面上的人口统计信息;在更可怕的情况下,数据被存储在一个巨大的 Lua 表中) 3)信息框可能对参数进行一些相当复杂的操作(例如,许多enwiki 信息框会生成页面描述,但实际上并没有办法从原始 wikitext 中猜测)。
  • 授予其他方法可能也不会更好。如果您正在寻找有关信息框的最多信息,Parsoid HTML 可能是最丰富的,因为它包含模板名称和参数以及呈现的 HTML,但使用起来可能比较棘手。
猜你喜欢
  • 2020-02-02
  • 1970-01-01
  • 2020-07-27
  • 2016-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-07
  • 2011-12-26
相关资源
最近更新 更多