2015-07-12 21 views
4

这是我现在的代码。它完美地列出了页面标题,但链接全部返回“未定义”。如何使用JSON链接列出维基百科页面标题?

function func(json) { 
    var e = document.getElementById('wiki'); 
    var i; 
    for (i=0; i < json.query.allpages.length; i++) { 
    e.innerHTML += i + ": " + '<a href="' + "http://en.wikipedia.org/wiki/" + json.query.link+ '">' + json.query.allpages[i].title + '</a>' + "<br />"; 
    } 
} 

function getFromWikipedia() { 
    var txt = document.getElementById('txt'); 
    var e = document.getElementById('wiki'); 
    var o = document.createElement("script"); 
     o.setAttribute("src", "http://en.wikipedia.org/w/api.php?action=query&list=allpages&format=json&apfrom="+txt.value+"&generator=alllinks&callback=func"); 
    e.appendChild(o); 
} 

追加“&道具=链接”和/或“&发电机= alllinks”的URL似乎并不影响结果。

我想知道我应该包括在这一部分:

'<a href="' + json.query.link+ '">' 

为了各自的链接列表的页面标题。 我试过“json.query.allpages [i] .pageID”和“json.query.alllinks”,但它一直没有工作。

编辑: 找到URL并转而执行pageid方法。

与此解决它:

function func(json) { 
    var e = document.getElementById('wiki'); 
    var i; 
    for (i=0; i < json.query.allpages.length; i++) { 
    e.innerHTML += i + ": " + '<a href="' + "http://en.wikipedia.org/?curid=" + json.query.allpages[i].pageid+ '">' + json.query.allpages[i].title + '</a>' + "<br />"; 
    } 
} 

回答

2

您可以直接使用的pageid创建链接您不完全了解generators如何在MediaWiki API中工作。

基本上,生成器是一种使用list作为页面源来检索properties的方法。它确实使用而不是将生成器用作另一个列表查询的输入。也就是说,您通常会使用generator=prop=,而不是list=。唯一的原因链接到MediaWiki(貌似)允许在所有是因为:

  1. 你可以用一个页面列表(或发电机),但没有prop=参数,like this查询。如果这样做,您只需获取页面的最小默认属性集(标题,名称空间和页面标识)。

  2. 您还可以将属性查询和列表查询合并为一个请求like this。你只要得到两个查询的结果,合并成相同的JSON/XML /等。输出,但他们将完全分开。 (您也可以multiple simultaneous list queries的方式。)

因此,当你用一个list=查询结合了generator=,你会得到双方的名单通常的输出和页面最小的一组属性相匹配由发电机。这两个输出将不会以任何实际的方式连接,除了成为相同的API响应的一部分。


无论如何,你想知道如何获得所有维基百科页面的标题和URL链接。那么,正如schudel在他们的回答中指出的那样,为了获得某些页面的URL,您需要prop=infoinprop=url;要在所有链接的页面上运行此查询,可以使用generator=alllinks。因此,你结束了:

注意,这会提供有关具有他们联系所有页面的信息。上运行的链接他们所有页面的查询,你需要添加参数galunique=true

(是的,this is documented,虽然没有很清楚,因为它也许可以。 )

显然,链接目标会包含很多缺页。链接来源似乎也包含空白标题的缺页,这大概是由于维基百科的链接数据库中有错误的记录。这可以通过重建(冗余)链接表来解决,但是,考虑到维基百科的大小,这需要相当长的一段时间(在此期间,可能必须将该站点锁定到只读模式以避免进一步的不一致) 。


要处理JavaScript中这个数据,你可以做这样的事情:

var apiURL = 'https://en.wikipedia.org/w/api.php?format=json&action=query&prop=info&inprop=url&generator=alllinks&callback=myCallback'; 

function myCallback(json) { 
    var e = document.getElementById('wiki'); 
    for (var id in json.query.pages) { 
    var page = json.query.pages[id]; 
    if (typeof(page.missing) !== 'undefined') continue; 
    e.innerHTML += 
     id + ': <a href="' + escapeHTML(page.fullurl) + '">' + escapeHTML(page.title) + '</a><br />'; 
    } 
    // handle query continuations: 
    if (json.continue) { 
    var continueURL = apiURL; 
    for (var attr in json.continue) { 
     continueURL += '&' + attr + '=' + encodeURIComponent(json.continue[attr]); 
    } 
    doAjaxRequest(continueURL); 
} 

doAjaxRequest(apiURL + '&continue='); 

请注意,我还包含了基本的机制来处理query continuations,因为你肯定会需要处理那些使用alllinks时。实施辅助功能escapeHTML()doAjaxRequest()作为练习。另外请注意,我没有真正测试过这个代码;我认为这是可以的,但可能有错误,我错过了。它也会产生一个可笑的长列表,并且可能会让你的浏览器慢慢爬行,因为维基百科有一个的页面。对于真正的应用程序,您可能希望引入某种按需加载方案(例如,当用户向下滚动到当前列表的末尾时才加载更多结果)。

+0

嘿,由于未知的原因代码不起作用(当我调用函数时没有出现) - 控制台也不会返回任何错误。我尝试将页面更改为所有页面,但链接仍显示为未定义。 – Yuu

+0

你是对的。我已更新我的回答 – schudel

+1

(第一个空白页面是因为https://github.com/wikimedia/mediawiki/blob/master/includes/api/ApiQuery.php#L401) – Rudie

1

,你有相同的查询都list=generator=的事实表明,我认为:

e.innerHTML += i + ": " + '<a href="'+ "http://en.wikipedia.org/wiki/?curid="+ json.query.allpages[i].pageid + '">' + json.query.allpages[i].title + '</a>' + "<br />"; 
相关问题