2015-05-02 109 views
1

我正在尝试从维基百科文章中获取图片。我有文章的标题,但似乎我需要知道访问缩略图的pageid。如何从标题中获得pageid?从标题获取维基百科pageid

我的JavaScript代码:

$.getJSON("http://en.wikipedia.org/w/api.php?action=query&titles=" + article + "&prop=pageimages&format=json&pithumbsize=350", function (data) { 
    imageURL = data.query.pages[/* pageid */].thumbnail.source; 
}); 

这里就是我解析(例如,对于文章= “车”):

{"query":{"pages":{"13673345":{"pageid":13673345,"ns":0,"title":"Car","thumbnail":{"source":"http://upload.wikimedia.org/wikipedia/commons/thumb/1/1e/Benz-velo.jpg/100px-Benz-velo.jpg","width":100,"height":80},"pageimage":"Benz-velo.jpg"}}}} 

^好像我首先需要知道它的13673345索引。

+0

不是图像就在那里?删除“拇指”和真正的文件名后的部分,这是你的形象:https://upload.wikimedia.org/wikipedia/commons/1/1e/Benz-velo.jpg –

+0

但是我怎么得到的源代码没有这样做:'data.query.pages [/ * pageid * /]。thumbnail.source'? – Benck

+0

只需枚举对象,直到找到具有预期标题的条目(实际上,应该只有一个) – Bergi

回答

2

OP询问如何“访问缩略图”,即返回数据中的URL。他没有要求如何访问缩略图背后的完整图像......这是其他答案的地址。

OP的问题是数据被键入到页面ID中。事实上,查询可能会返回多个文章,在这种情况下,会有多个页面ID和缩略图。

以下查询返回的代码段中使用的数据:

http://en.wikipedia.org/w/api.php?action=query&titles=Stack_Overflow&prop=pageimages&format=json&pithumbsize=350

和OP可以使用此代码提取页面ID:

var pageid = []; 
for(var id in data.query.pages) { 
    pageid.push(id); 
} 

运行以下测试的代码段。

<html> 
 
<body> 
 
    
 
<img id="thumbnail"/> 
 
    
 
<script type="text/javascript"> 
 
    
 
var data = { 
 
     "query": 
 
     { 
 
     "normalized": [ 
 
     { 
 
      "from": "Stack_Overflow", 
 
      "to": "Stack Overflow" 
 
     }], 
 
     "pages": 
 
     { 
 
      "21721040": 
 
      { 
 
      "pageid": 21721040, 
 
      "ns": 0, 
 
      "title": "Stack Overflow", 
 
      "thumbnail": 
 
      { 
 
       "source": "http://upload.wikimedia.org/wikipedia/commons/thumb/6/6a/Stack_Overflow_homepage.png/350px-Stack_Overflow_homepage.png", 
 
       "width": 350, 
 
       "height": 185 
 
      }, 
 
      "pageimage": "Stack_Overflow_homepage.png" 
 
      } 
 
     } 
 
     } 
 
    }; 
 
\t 
 

 
    
 
    // get the page IDs 
 
\t var pageid = []; 
 
\t for(var id in data.query.pages) { 
 
\t \t pageid.push(id); 
 
\t } 
 
\t 
 
    // display the thumbnail using a page ID 
 
    document.getElementById('thumbnail').src = data.query.pages[ pageid[0] ].thumbnail.source; 
 
    
 
    </script> 
 
    
 
    </body> 
 
    </html>

+0

for-in虽然被认为是相当危险的模式(因为不能保证“安全”属性名称)。相反,ES5有'Object.keys()'安全地获取任何对象的属性名称集合。 –

0

刚刚建立与JSON.parse你的JSON对象,所以你有一个对象,看起来像:

var response = { 
    query: { 
    pages: { 
     "13673345":{ 
     pageid: 13673345, 
     ns: 0, 
     title: "Car", 
     thumbnail: { 
      source: "http://upload.wikimedia.org/wikipedia/commons/thumb/1/1e/Benz-velo.jpg/100px-Benz-velo.jpg", 
      width: 100, 
      height: 80 
     }, 
     pageimage: "Benz-velo.jpg" 
     } 
    } 
    } 
}; 

然后你就可以清楚地看到你不需要的pageid丝毫,你只需要处理正确的“页面”对象。

在这种情况下,只有一个,但即使会有多,只是通过Object.keysresponse.query.pages对象运行:

var pages = response.query.pages; 
var propertyNames = Object.keys(pages); 
propertyNames.forEach(function(propertyName) { 
    var page = pages[propertyName]; 
    var thumbnail = page.thumbnail.src; 
    var imgURL = thumbnail.replace("/thumb/",'').replace(/\.(jpg|png).*/,".$1"); 
    doSomethingWith(imgURL); 
}); 

(注意文件的扩展名正则表达式,这是我们做的,因为谁说,所有图片是JPG格式吗?最好选择JPG和PNG,因为这些是网络上流行的两种图像格式)

+0

我得到了一个TypeError for imgURL行:'[Error] TypeError:undefined不是一个对象(评估'缩略图.replace')'。有什么问题? – Benck

+1

这将是有道理的。不要复制粘贴我的应付,确保我没有错别字。不是说有错误,你应该说的是“嘿JSON使用'source',而不是'src'”。 SO非常适合获得答案,但总是要确保代码的人建议没有输入错误;) –

+0

@Benck - 上述代码导致错误时有一个小错误。更改“page.thumbnail.src;”到“page.thumbnail.source;”它会工作。除此之外,Mike K为您的问题提供了一个坚实的答案。 – Roberto