7

请考虑这个javascript:

$.ajax({
    url:'http://ichart.finance.yahoo.com/table.csv?s=GS&a=00&b=1&c=2010&d=08&e=3&f=2012&g=d&ignore=.csv',
    type:'get',
    dataType:'jsonp',
    success:function(data){
        alert(data);
    }
})

该 URL 返回一个 .csv 文件,但我指定了jsonp数据类型,因为这是一个跨域 ajax 请求。如果没有该参数,我会收到“不允许原点”错误。

由于我指定了jsonp数据类型,因此 ajax 函数会抛出错误,因为 .csv 文件不是 JSON 格式。但在开发控制台中,我可以看到浏览器确实收到了一个连贯的 .csv 文件。所以我知道我已成功接收 CSV 文件。我认为这应该是可能的,但我不确定如何正确地将这个 csv 文件接收到我的 ajax 函数中?

当然,如果我可以让这个 URL 返回一个格式正确的 JSON 字符串,那将是最好的,但我不确定我能做到这一点。

这是一个你可以尝试的小提琴,你必须打开开发控制台才能看到该错误:http: //jsfiddle.net/92uJ4/3/

任何帮助是极大的赞赏。

蒂姆

4

2 回答 2

8

不幸的是,跨域限制意味着这根本行不通。该系统是专门构建的,因此您无法使用 AJAX 拉取任意跨域内容。没有任何类型的预解析方法可以将您获得的非 JSONP 数据转换为实际的 JSONP 数据(因为这会破坏限制点)。

您将不得不调用从 Yahoo! 提取数据的本地服务器。并将其发送到您的 AJAX 请求,或者找到某种服务,该服务将从任意 URL 中提取并将数据作为 JSONP 返回。碰巧的是,雅虎!就提供了这样的服务:YQL(雅虎查询语言)。有关更多详细信息,请参阅此链接

要完成您想要的,请使用此小提琴中的代码:http: //jsfiddle.net/c5TeM/1/

function get_url(remote_url) {
    $.ajax({
        url: "http://query.yahooapis.com/v1/public/yql?"+
"q=select%20*%20from%20html%20where%20url%3D%22"+
encodeURIComponent(remote_url)+
"%22&format=json",
        type: 'get',
        dataType: 'jsonp',
        success: function(data) {
            alert(data.query.results.body.p);
        },
        error: function(jqXHR, textStatus, errorThrow){
            alert(jqXHR['responseText']);
        }
    })
}
于 2012-09-03T16:44:13.367 回答
0

修改最后提供的 jsfiddle 导致我找到以下解决方案:http:
//jsfiddle.net/9zcsxq5a/

var str_parse = function(data){
  data = data.replace(/<[/]*body[^>]*>/g,'');
  data = data.replace(/<--[\S\s]*?-->/g,'');
  data = data.replace(/[\r]+/g,'');
  data = data.replace(/<noscript[^>]*>[\S\s]*?<\/noscript>/g,'');
  data = data.replace(/<script[^>]*>[\S\s]*?<\/script>/g,'');
  data = data.replace(/<script.*\/>/,'');
  return data
}

get_url = function(URL){
  $.ajax({
    url:"http://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20html%20where%20url%3D%22"+
    encodeURIComponent(URL)+"%22",
    dataType: "jsonp",
    type: 'get',
    success: function(r){
      data=r.results[0];
      data = str_parse(data);
      data = data.split(/[\n]+/);
    
    //// first line of the csv holds the colnames
      var HEADER = data[0].split(",");
      data.shift();
      
    /// create { OBJECT } structure for each row
        data = (function(){
        var o=[]; 
        data.forEach(function(E){
            o.push( (function(){ 
            var _o={}; 
            for( var i=0, s=E.split(",");i<s.length;i++ ) 
              _o[HEADER[i]]=s[i];
            return _o;
          }()) );
        });
        return o;
      }());
      
    /// THE FINAL OBJECT 
      console.log(data);
      return data;
    }
  }); 
}

$('#a').click(function() {
    get_url("http://ichart.finance.yahoo.com/table.csv?a=8&b=11&e=10&g=d&c=2005&d=2&f=2016&s=YHOO");
});

csv 通过 asis 传递,然后将被修改为 json 对象,类似于您将在使用时获得的对象(但没有日期限制)

http://query.yahooapis.com/v1/public/yql?q=select%20%2a%20from%20yahoo.finance.historicaldata%20where%20symbol%20in%20%28%27YHOO%27%29%20and% 20startDate%20=%20%272009-09-11%27%20and%20endDate%20=%20%272010-03-10%27&diagnostics=true&env=store://datatables.org/alltableswithkeys

于 2016-07-02T19:53:29.433 回答