2

我正在使用 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属性中,但都是纯文本。

例如,如果我想从该文本中获取 series No. of seasons, Genres,值怎么办?Country of origin

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

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

任何想法?

谢谢

4

1 回答 1

3

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

你有两个选择。一种是解析 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 发生了显着变化,您的代码可能无法正常运行。您可能还想进行一些错误检查,例如在调用unserializeand之前loadHTML

于 2014-10-17T09:03:12.797 回答