【问题标题】:Get Wikipedia pageid from title从标题获取 Wikipedia pageid
【发布时间】:2015-07-12 10:12:21
【问题描述】:

我正在尝试从 Wikipedia 文章中获取图像。我有文章的标题,但似乎我需要知道 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;
});

这是我正在解析的内容(article = "Car" 的示例):

{"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 索引。

【问题讨论】:

  • 图片不在那里吗?删除“拇指”和真实文件名后面的部分,这就是你的图像:upload.wikimedia.org/wikipedia/commons/1/1e/Benz-velo.jpg
  • 但是我如何在不这样做的情况下获取源代码:data.query.pages[/* pageid */].thumbnail.source ?
  • 只需枚举对象,直到找到具有预期标题的条目(实际上应该只有一个)

标签: javascript json parsing wikipedia-api


【解决方案1】:

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

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

以下查询返回代码sn-p中使用的数据:

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 );
}

运行下面的代码sn-p进行测试。

<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"
          }
        }
      }
    };
	

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

【讨论】:

  • for-in 被认为是一种相当危险的模式(因为不能保证“安全”属性名称)。相反,ES5 有Object.keys() 来安全地获取任何对象的属性名称集。
【解决方案2】:

只需使用 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,你只需要处理正确的“pages”对象。

在这种情况下只有一个,但即使有多个,也只需为 response.query.pages 对象运行 Object.keys:

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);
});

(注意文件扩展名 regexp,我们这样做是因为谁说所有图像都是 jpg?最好选择 jpg 和 png,因为它们是网络上流行的两种图像格式)

【讨论】:

  • imgURL 行出现 TypeError:[Error] TypeError: undefined is not an object (evaluating 'thumbnail.replace')。有什么问题?
  • 这是有道理的。不要只是复制粘贴我的应付,确保我没有错别字。与其说有错误,不如说“嘿,JSON 使用 source,而不是 src”。 SO 非常适合获得答案,但请始终确保人们建议的代码没有输入错误;)
  • @Benck - 上面的代码中有一个小错误导致了错误。更改“page.thumbnail.src;”到“page.thumbnail.source;”它会起作用。除此之外,Mike K 为您的问题提供了可靠的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-21
  • 1970-01-01
  • 2023-03-04
相关资源
最近更新 更多