你很幸运:这并不像它可能的那样棘手,因为 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 发生了显着变化,您的代码可能无法正常运行。您可能还想进行一些错误检查,例如在调用unserialize
and之前loadHTML
。