Javascript 如何使用JSON列出带有链接的Wikipedia页面标题?
这是我当前的代码。它完美地列出了页面标题,但所有链接都返回“未定义”Javascript 如何使用JSON列出带有链接的Wikipedia页面标题?,javascript,json,wikipedia-api,Javascript,Json,Wikipedia Api,这是我当前的代码。它完美地列出了页面标题,但所有链接都返回“未定义” 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.
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);
}
函数func(json){
var e=document.getElementById('wiki');
var i;
for(i=0;i'<a href="' + json.query.link+ '">'
”+“
”;
您可以直接使用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 />";
}
}
函数func(json){
var e=document.getElementById('wiki');
var i;
for(i=0;i在同一个查询中同时存在
list=
和generator=
这一事实向我表明,您并不完全了解MediaWiki API的工作原理
基本上,生成器是一种使用作为要检索的页面源的方法。使用生成器作为另一个列表查询的输入没有任何意义。也就是说,您通常将generator=
与prop=
一起使用,而不是与list=
一起使用。MediaWiki(似乎)允许这样做的唯一原因是:
prop=
参数。如果您这样做,您将只获得页面的最小默认属性集(标题、名称空间和页面ID)生成器=
与列表=
查询相结合时,您将获得列表的常规输出和生成器匹配的页面的最小属性集。这两个输出不会以任何实际方式连接,除非是同一API响应的一部分
无论如何,你想知道如何获得所有维基百科页面的标题和URL链接。好的,正如schudel在他们的回答中所指出的,要获得某些页面的url,您需要使用
inprop=url
;要在所有链接页面上运行此查询,可以使用generator=alllinks
。因此,您最终会:
galunique=true
:
要在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=');
var-apiURL=https://en.wikipedia.org/w/api.php?format=json&action=query&prop=info&inprop=url&generator=alllinks&callback=myCallback';
函数myCallback(json){
var e=document.getElementById('wiki');
for(json.query.pages中的变量id){
var page=json.query.pages[id];
如果(typeof(page.missing)!=‘undefined’)继续;
e、 innerHTML+=
id+':
;
}
//处理查询继续:
if(json.continue){
var continueURL=apiURL;
for(json中的var attr.continue){
continueURL+='&'+attr+'='+encodeURIComponent(json.continue[attr]);
}
doAjaxRequest(continueur);
}
doAjaxRequest(apirl+'&continue=');
注意,我还包括了一个处理的基本机制,因为在使用
alllinks
时,您肯定需要处理这些机制只是一个练习。另外请注意,我还没有实际测试这段代码;我认为这没问题,但可能有一些我遗漏的错误。它还会产生一个长得离谱的列表,可能会让你的浏览器慢到爬行的速度,这仅仅是因为Wikipedia有很多页面。对于一个真正的应用程序,你可能想引入一些f按需加载方案(例如,当用户向下滚动到当前列表的末尾时,仅加载更多结果)。嘿,由于未知原因,代码不起作用(调用函数时没有显示任何内容)-控制台也不会返回任何错误。我已尝试将页面更改为“所有页面”,但链接仍显示为未定义。(第一个空白页是因为)
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=');