维基媒体API-从修订版维基文本中提取JSON或XML以用于PHP


Wikimedia API - Extract JSON or XML from revision wikitext to use in PHP

我正在使用wikimedia API提取有关电视剧的信息(年份、季数、类型等)。

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

https://en.wikipedia.org/w/api.php?action=query&prop=修订|图像&tities=The_Vampire_Diaries&rvprop=时间戳|标记|内容&format=json

正如你所注意到的,我需要的信息在revisions属性中,但都是纯文本。

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

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

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

知道吗?

感谢

你很幸运:这比可能的要简单,因为维基百科的编辑很好,并且给页面提供了一些语义标记。

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

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

这提供了这样一个链接:

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

太棒了。我们现在有了呈现的wikitext。让我们把它放到一个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之前。