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

问题描述 投票:0回答:3

中有这个奇特的信息框。我如何获得 的值?

wikipedia dbpedia wikipedia-api structured-data wikidata
3个回答
48
投票

错误的方法:尝试解析 HTML

使用 (cURL/jQuery/file_get_contents/requests/wget/more jQuery) 获取文章的 HTML 文章代码,然后使用 DOM 解析器来提取

table.infobox tr[3] td
/ 使用正则表达式

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

另一种错误的方式:尝试解析维基文本

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

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

事实上,情况并非如此。模板是“递归的”,所以你可能会遇到像

param1 = {{convert|10|km|mi}}
这样的东西;模板参数可能包含复杂的 wiki 文本或 HTML 标记;文章维基文本中可能缺少某些参数,并由模板从子页面或其他数据存储库获取。如果参数包含有自己的参数的其他模板,那么仅仅找出参数的开始和结束位置可能不是一件简单的事情。

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

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

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

DBPedia 是一个通过自动化方式收集维基百科信息框信息并以结构化形式发布的项目。您可以通过转到

http://dbpedia.org/page/<Wikipedia article name>
找到 Wikipedia 文章的 DBPedia 页面,例如http://dbpedia.org/page/Albert_Einstein。它有许多数据格式、转储、SPARQL 端点各种其他东西

错误的方法做对了

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

或者,您可以从 wikitext 开始,并使用更简单的客户端

mwparserfromhell

 Python 模块 (docs) 或更强大的 parsoid-jsapi(与 Wikipedia REST 内容交互)将其解析为语法树服务。

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

wptools


    


1
投票
接受的答案在所有方面都是正确的,尤其是解析 wikitextxt 的潜台词是

可怕

但是,如果从 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 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>

这是使用 Mediawiki API 沙箱进行此类请求的 URI。请注意包含 parsetree 的属性列表。我添加了一些其他类别(包括类别)以防万一,您可能希望将列表修剪为您实际需要的内容,以节省您的时间和其他人的服务器。


0
投票
基金会本身现在有一个更新的选项...维基媒体企业版现在有一个测试版,其中包括解析的信息框内容

https://enterprise.wikimedia.com/news/structed-contents-wikipedia-infobox/

© www.soinside.com 2019 - 2024. All rights reserved.