Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何使用JSON列出带有链接的Wikipedia页面标题?_Javascript_Json_Wikipedia Api - Fatal编程技术网

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”; } } 函数getFromWikipedia(){ var txt=document.getElementById('txt'); var e=document.getElementById('wiki'); var o=document.createElement(“脚本”); o、 setAttribute(“src”http://en.wikipedia.org/w/api.php?action=query&list=allpages&format=json&apfrom=“+txt.value+”&generator=alllinks&callback=func”); e、 儿童(o); } 在URL中添加“&prop=links”和/或“&generator=alllinks”似乎不会影响结果

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

'<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)

  • 您还可以将属性查询和列表查询组合到单个请求中。您将只得到两个查询的结果,并合并到相同的JSON/XML/etc.输出中,但它们在其他方面是完全分开的。(你也可以这样做。)

  • 因此,当您将
    生成器=
    列表=
    查询相结合时,您将获得列表的常规输出和生成器匹配的页面的最小属性集。这两个输出不会以任何实际方式连接,除非是同一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=');