问题 从维基百科文章中摘录?


我一直在上下 维基百科API,但我无法弄清楚是否有 不错 获取文章摘录的方式(通常是第一段)。获得该段落的HTML格式也会很好。

我目前看到的获取类似代码片段的唯一方法是执行全文搜索(),但这不是我想要的(太短)。

有没有其他方法来获取维基百科文章的第一段而不是野蛮地解析HTML / WikiText?


10165
2018-04-01 12:28


起源

这是一个无服务器的示例,它从随机的Wikipedia文章中获取前N个字符。这不是你想要的,但可能有所帮助: stackoverflow.com/q/15293680/589059 - rkagerer


答案:


使用此链接以xml格式获取未解析的介绍 “http://en.wikipedia.org/w/api.php?format=xml&action=query&prop=extracts&exsentences=10&titles=Aati kalenja”

之前我可以通过在src中添加像上面链接一样的iframe来从单个页面中的类别中引入主题/文章列表..但是现在chrome正在抛出这个错误 - “拒绝显示文档,因为X-禁止显示帧选项“。通过什么方式?请帮忙..


6
2017-09-09 07:46



你的第二段听起来像一个问题,而不是一个答案。如果您想要答案,则应将其作为新问题发布。仍然,+1提及 prop=extracts 在你的第一段。 (我刚刚在下面发布了一个稍微详细的说明。) - Ilmari Karonen
您还可以添加exintro属性以仅获取介绍: fr.wikipedia.org/w/... - CedricSoubrie


我发现无法通过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>

3
2018-04-02 11:31



你应该使用 action=render url参数;这样你需要加载更少的东西。此外,摘录通常不是第一段,而是第一段 <h2>。 - Tgr


正如ARAVIND VR所说,在wiki上运行 MobileFrontend扩展  - 其中包括维基百科 - 您可以轻松地通过该文章获取文章的摘录 MediaWiki API 通过使用 prop=extracts API查询

例如, 这个链接 会给你一个简短的摘录 维基百科上的Stack Overflow文章 在JSON包装器中。

查询的各种选项可用于控制摘录格式(HTML或纯文本),其最大长度(以字符和/或句子为单位,并可选择将其限制为文章的介绍部分)和章节标题的格式在输出中。也可以在单个查询中从多个文章中获取介绍摘录。


3
2017-09-09 09:31



谢谢,这就是我要找的,完美的API。 - Vinay Pareek


通过参数,可以使用API​​获得文章的“介绍” rvsection=0 如 在这里解释

将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);

2
2017-12-19 15:07