如何将维基百科API自动填充建议限制在某个类别?

时间:2016-01-01 23:38:29

标签: api autocomplete categories wikipedia

我有这个很棒的工作代码,可以从维基百科中获取自动填充建议。这非常有用,除了我喜欢它只推荐Bands。例如,输入" Pink"只返回/乐队/以#" Pink"开头,而不是世界上所有涉及粉红'。

有谁知道如何做到这一点? http://codepen.io/anon/pen/VePapK

我发现有一种方法可以使用查询操作here(而不是opensearch)按类别过滤结果,但奇怪的是,它似乎并不是一个广泛的& #34;音乐"或"乐队"类别。这样就开启了更多未解决的问题....任何帮助都会得到赞赏。

编辑:或者,如果有人知道更简单的方法来显示您网站上所有重要频段的更新列表,请告知我们。

<!DOCTYPE html>
<html lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>

<body>
            <form method="get" id="search">
                <input type="text" class="searchbox" value="Type here.. " onblur="if(this.value == '') { this.value = 'Type here..'; }" onfocus="if(this.value == 'Type here..') { this.value = ''; }" name="s">
                <button type="submit">Submit</button>
            </form> 





<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
<link rel="stylesheet" href="https://ajax.googleapis.com/ajax/libs/jqueryui/1.11.3/themes/smoothness/jquery-ui.css" />
<script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.11.3/jquery-ui.min.js"></script>
<script type="text/javascript">
$(".searchbox").autocomplete({
    source: function(request, response) {
        console.log(request.term);
        $.ajax({
            url: "http://en.wikipedia.org/w/api.php",
            dataType: "jsonp",
            data: {
                'action': "opensearch",
                'format': "json",
                'search': request.term
            },
            success: function(data) {
                response(data[1]);
            }
        });
    }
});
</script>
</body>
</html>

1 个答案:

答案 0 :(得分:4)

关于维基百科的类别系统确实存在很多问题。值得庆幸的是,还有更好的方法。

这是一种可以从维基百科搜索中获得所需内容的替代方法:您可以使用维基百科的CirrusSearch API搜索参数来获取某个类别中的文章(通过incategory:<category title>),带有指向另一个维基百科页面的链接(通过linksto:<page name>),或通过转换常见维基百科模板的页面(通过hastemplate:<template name>)。如果您知道正确的维基百科类别或页面,则可以轻松使用前两个选项。虽然最后一个可能听起来很奇怪,但维基百科组织良好的模板系统可能是你最好的选择。许多乐队文章都有一个共同的infobox on the right,可以帮助您缩小搜索范围。

您可以像这样使用CirrusSearch和hastemplate:Infobox_musical_artist

https://en.wikipedia.org/w/api.php?action=query&list=search&format=json&srsearch=hastemplate%3AInfobox_musical_artist+daft

以此格式返回页面列表:

{
"batchcomplete": "",
"continue": {
    "sroffset": 10,
    "continue": "-||"
},
"query": {
    "searchinfo": {
        "totalhits": 470,
        "suggestion": "hastemplate:Infobox_musical_artist dart",
        "suggestionsnippet": "hastemplate:Infobox_musical_artist <em>dart</em>"
    },
    "search": [
        {
            "ns": 0,
            "title": "Daft Punk",
            "snippet": "<span class=\"searchmatch\">Daft</span> Punk are an electronic music duo consisting of French musicians Guy-Manuel de Homem-Christo and Thomas Bangalter. The duo achieved significant popularity",
            "size": 76278,
            "wordcount": 8170,
            "timestamp": "2016-02-08T01:33:54Z"
        },
        ...

以下是 CodePen演示http://codepen.io/slaporte/pen/obmaWY

它仍然可能无法捕获维基百科上100%的乐队。如果您正在寻找特定的子类型,则可以尝试使用hastemplate参数以及链接或类别来缩小或扩展搜索范围。您可以了解有关其他Wikipedia CirrusSearch参数here的更多信息。

顺便说一句,这是一种有趣的自动完成方法!