25

<some Wikipedia article> 中有这个花哨的信息框。如何获得 <this field and that> 的值?

4

2 回答 2

43

错误的方法:尝试解析 HTML

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

在大多数情况下,这实际上是一个非常糟糕的主意。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 中没有。您可以通过文章页面左侧工具栏中的Wikidata 项目链接找到文章的 Wikidata 页面并查看其中包含哪些信息;以编程方式,您可以使用wbgetentities API 模块(沙箱概念解释)访问 Wikidata 信息,例如wikidata.org/w/api.php?action=wbgetentities&sites=enwiki&titles=Albert_Einstein。还有一个SPARQL 端点数据库转储和PHPJavaPython客户端。

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

错误的方法做对了

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

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

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

于 2015-11-23T01:14:13.193 回答
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>

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

于 2020-09-29T01:53:46.343 回答