维基媒体API - 从修订版wikitext中提取JSON或XML以在PHP中使用

时间:2014-10-17 08:34:10

标签: php json wikimedia

我使用维基媒体API提取电视连续剧的信息(年份,季节数,流派等等)。

我使用了这样的查询(请参阅输出):

https://en.wikipedia.org/w/api.php?action=query&prop=revisions|images&titles=The_Vampire_Diaries&rvprop=timestamp|tags|content&format=json

你可以注意到我需要的信息在revisions属性中,但它都是纯文本。

例如,如果我想从该文本中获取系列No. of seasonsGenresCountry of origin值,该怎么办?

所以我想问你的是:有没有一种简单的方法可以访问这些信息?

我的意思是也许有一种方法可以将这种纯文本转换为JSON或XML,这样就很容易访问信息。 我知道有一个parse wikimedia选项可以将修订文本解析为HTML,但我不认为访问HTML中的这些信息对我来说是最好的选择。

有什么想法吗?

由于

1 个答案:

答案 0 :(得分:3)

你很幸运:这不像它可能那么棘手,因为维基百科的编辑很好并且给了页面一些语义标记。

您有两种选择。一个是解析wiki文本,正如您在问题中所建议的那样。另一种是解析渲染的HTML。有许多库可以解析HTML:解析wikitext要困难得多。因此,让我们解析HTML。

我们将使用action=parse功能为我们解析wiki文本。然后,我们可以使用page=The_Vampire_Diaries指定标题。由于我们使用的是PHP,因此我们会使用format=php选项。

这给出了这样一个链接:

https://en.wikipedia.org/w/api.php?action=parse&page=The_Vampire_Diaries&format=php 

优异。我们现在有渲染的wiki文本。让我们把它变成一个PHP变量:

$url = '...'; // as above
$apiResult = file_get_contents($url);

$parsedResult = unserialize($apiResult);

$renderedHTML = $parsedResult['parse']['text']['*'];

我们现在有了页面的HTML。

让我们使用DOMDocument类来获取我们想要的元素。我们很幸运,该行有一个类:category。然后我们想要直接的后代a元素。

$dom = new DOMDocument;

$dom->loadHTML($renderedHTML);
$xpath = new DOMXPath($dom);

$elements = $xpath->query('//*[contains(@class, \'category\')]/a');

$genres = array();

foreach($elements as $element) {
    $genres[] = $element->nodeValue;
}

因此$genres数组现在包含您想要的值。 var_export给出了这个:

array (
  0 => 'Supernatural drama',
  1 => 'Horror',
  2 => 'Fantasy',
  3 => 'Romance',
)

这当然是非常脆弱的。如果HTML发生重大变化,您的代码可能无法正常运行。您可能还想进行一些错误检查,例如在致电unserializeloadHTML之前。