我正在使用wikimedia API提取有关电视剧的信息(年份、季数、类型等)。
我使用了这样的查询(请查看输出):
https://en.wikipedia.org/w/api.php?action=query&prop=修订|图像&tities=The_Vampire_Diaries&rvprop=时间戳|标记|内容&format=json
正如你所注意到的,我需要的信息在revisions
属性中,但都是纯文本。
例如,如果我想从该文本中获得系列No. of seasons
、Genres
、Country 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发生了显著变化,那么您的代码可能无法正常工作。您可能还想进行一些错误检查,例如在调用unserialize
和loadHTML
之前。