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

How to extract information from a Wikipedia infobox?

中有这种奇特的 infobox。如何获取 的值?

错误的方式:试图解析HTML

Use (cURL/jQuery/file_get_contents/requests/wget/more jQuery) to fetch the HTML article code of the article, then use a DOM parser to extract table.infobox tr[3] td / use a regex.

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

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

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

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

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

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

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

Wikidata is a project to build a knowledge base containing structured data; it is maintained by the same global movement that built Wikipedia, so information is in the process of being moved over. This is a manual process, so not all information in Wikipedia is available via Wikidata, on the other hand there is a lot of information that's in Wikidata but not in Wikipedia. You can find the Wikidata page of an article and see what information it contains by following the Wikidata item link in the left-hand toolbar on the article page; programmatically, you can access Wikidata information using the wbgetentities API module (sandbox, explanation of concepts), e.g. wikidata.org/w/api.php?action=wbgetentities&sites=enwiki&titles=Albert_Einstein. There is also a SPARQL endpoint, database dumps, and clients in PHP, Java and Python.

DBPedia is a project to harvest Wikipedia infobox information by automated means and publish it in a structured form. You can find the DBPedia page for a Wikipedia article by going to http://dbpedia.org/page/<Wikipedia article name>, e.g. http://dbpedia.org/page/Albert_Einstein. It has many data formats, dumps, a SPARQL endpoint and various other things.

错误的方法做对了

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

或者,您可以从维基文本开始,使用与维基百科 REST 内容服务交互的更简单的客户端 mwparserfromhell Python module (docs) or the more powerful parsoid-jsapi 将其解析为语法树。

试图从 wiki 文本中提取信息框内容的高级 Python 库是 wptools

接受的答案在所有方面都是正确的,尤其是解析 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 的属性列表。为了以防万一,我已经包含了一些其他类别(包括 类别 ),您可能希望 trim 该列表符合您的实际需要,以节省您和其他人的时间服务器。