我使用维基媒体API提取电视连续剧的信息(年份,季节数,流派等等)。
我使用了这样的查询(请参阅输出):
你可以注意到我需要的信息在revisions
属性中,但它都是纯文本。
例如,如果我想从该文本中获取系列No. of seasons
,Genres
,Country of origin
值,该怎么办?
所以我想问你的是:有没有一种简单的方法可以访问这些信息?
我的意思是也许有一种方法可以将这种纯文本转换为JSON或XML,这样就很容易访问信息。
我知道有一个parse
wikimedia选项可以将修订文本解析为HTML,但我不认为访问HTML中的这些信息对我来说是最好的选择。
有什么想法吗?
由于
答案 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发生重大变化,您的代码可能无法正常运行。您可能还想进行一些错误检查,例如在致电unserialize
和loadHTML
之前。