我一直在Wikipedia API上下浮动,但我不知道是否有一种很好的方法来获取文章的摘录(通常是第一段)。获得该段落的 HTML 格式也会很好。
我目前看到的获得类似于片段的东西的唯一方法是执行全文搜索(example),但这并不是我真正想要的(太短了)。
除了野蛮地解析 HTML/WikiText 之外,还有其他方法可以获取 Wikipedia 文章的第一段吗?
我一直在Wikipedia API上下浮动,但我不知道是否有一种很好的方法来获取文章的摘录(通常是第一段)。获得该段落的 HTML 格式也会很好。
我目前看到的获得类似于片段的东西的唯一方法是执行全文搜索(example),但这并不是我真正想要的(太短了)。
除了野蛮地解析 HTML/WikiText 之外,还有其他方法可以获取 Wikipedia 文章的第一段吗?
使用此链接以 xml 形式获取未解析的介绍“http://en.wikipedia.org/w/api.php?format=xml&action=query&prop=extracts&exsentences=10&titles=Aati kalenja”
早些时候,我可以通过像上面的链接一样添加带有 src 的 iframe,在单个页面中从一个类别中引入主题/文章列表。但现在 chrome 抛出此错误 - “拒绝显示文档,因为 X 禁止显示 -框架选项。” 有办法通过吗?请帮忙..
正如 ARAVIND VR 所指出的,在运行MobileFrontend 扩展(包括 Wikipedia)的 wiki 上,您可以使用API 查询轻松地通过MediaWiki API获取文章的摘录。prop=extracts
例如,此链接将为您提供JSON 包装器中的Wikipedia 上 Stack Overflow 文章的简短摘录。
查询的各种选项可用于控制摘录格式(HTML 或纯文本)、其最大长度(以字符和/或句子为单位,并可选择将其限制为文章的介绍部分)和部分标题的格式在输出中。也可以在单个查询中从多篇文章中获取介绍摘录。
我发现无法通过 API 做到这一点,所以我求助于解析 HTML,使用PHP 的 DOM 函数。这很容易,例如:
$doc = new DOMDocument();
$doc->loadHTML($wikiPage);
$xpath = new DOMXpath($doc);
$nlPNodes = $xpath->query('//div[@id="bodyContent"]/p');
$nFirstP = $nlPNodes->item(0);
$sFirstP = $doc->saveXML($nFirstP);
echo $sFirstP; // echo the first paragraph of the wiki article, including <p></p>
可以使用 API 仅获取文章的“介绍”,参数rvsection=0
如here所述。
将 Wiki 文本转换为 HTML 有点困难;我想有更完整/官方的方法,但这是我最终做的:
// remove templates (even nested)
do {
$c = preg_replace('/[{][{][^{}]+[}][}]\n?/', '', $c, -1, $count);
} while ($count > 0);
// remove HTML comments
$c = preg_replace('/<!--(?:[^-]|-[^-]|[[[^>])+-->\n?/', '', $c);
// remove links
$c = preg_replace('/[[][[](?:[^]|]+[|])?([^]]+)[]][]]/', '$1', $c);
$c = preg_replace('/[[]http[^ ]+ ([^]]+)[]]/', '$1', $c);
// remove footnotes
$c = preg_replace('#<ref(?:[^<]|<[^/])+</ref>#', '', $c);
// remove leading and trailing spaces
$c = trim($c);
// convert bold and italic
$c = preg_replace("/'''((?:[^']|'[^']|''[^'])+)'''/", $html ? '<b>$1</b>' : '$1', $c);
$c = preg_replace("/''((?:[^']|'[^'])+)''/", $html ? '<i>$1</i>' : '$1', $c);
// add newlines
if ($html) $c = preg_replace('/(\n)/', '<br/>$1', $c);