如何从另一个网页加载 table 到数组中?

How to load a table, from another webpage, into an array?

我正在创建一个 Greasemonkey/Tampermonkey 脚本,用于将一些统计数据放入数组中。

使用 JavaScript,我将如何使页面在后台加载 URL (football.fantasysports.yahoo.com/f1/326198/pointsagainst?pos=QB) 并创建一个包含前两列的数组 (RankTeam)?

我遇到的问题是在后台执行所有这些操作,我想我会使用 AJAX。任何帮助将不胜感激。

我想你想做这样的事情:

// ==UserScript==

// @name          Fantasy Stuff

// @namespace     http://football.fantasysports.yahoo.com/f1/326198/pointsagainst?pos=QB&ntid=

// @description   An example of Fantasy Stuff

// @include       *

// ==/UserScript==

var doc = document;
function T(t){
  return doc.getElementsByTagName(t);
}
var tms = T('tbody')[0].getElementsByTagName('a'), teams = [];
for(var i=0,n=1,l=tms.length; i<l; i++,n++){
  teams[n] = tms[i].text;
}
// teams array should hold results
console.log(teams); // in FireFox

对于静态页面(如the one you linked),使用GM_xmlhttpRequest()DOMParser提取你想要的元素。见下文。

对于动态页面(AJAX驱动),使用来自 How to get an AJAX get-request to wait for the page to be rendered before returning a response?

的技巧

这里是一个完整的脚本,展示了如何从第三方页面提取信息并将其放入数组变量中:

// ==UserScript==
// @name        _Grab stuff of a *static*, third-party web site.
// @include     https://whosebug.com/questions/*
// @require     http://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js
// @grant       GM_xmlhttpRequest
// ==/UserScript==

GM_xmlhttpRequest ( {
    method:     "GET",
    url:        "http://football.fantasysports.yahoo.com/f1/326198/pointsagainst?pos=QB&ntid=",
    onload:     parseResponse,
    onerror:    function (e) { console.error ('**** error ', e); },
    onabort:    function (e) { console.error ('**** abort ', e); },
    ontimeout:  function (e) { console.error ('**** timeout ', e); }
} );

function parseResponse (response) {
    var parser  = new DOMParser ();
    /* IMPORTANT!
        1) For older browsers, see
        https://developer.mozilla.org/en-US/docs/Web/API/DOMParser
        for a work-around.

        2) jQuery.parseHTML() and similar is bad because it causes images, etc., to be loaded.
    */
    var ajaxDoc         = parser.parseFromString (response.responseText, "text/html");
    var statRows        = ajaxDoc.querySelectorAll ("#statTable0 > tbody > tr");
    var newStatTable    = $(statRows).map ( function () {
        var tblRow      = $(this);
        var teamRank    = parseInt (tblRow.find (".rank-indicator").text().trim(), 10);
        var teamName    = tblRow.find ("td:eq(1)").text().trim();

        return [ [teamRank, teamName] ];
    } ).get ();

    /*-- newStatTable, is a 2-D array like:
        [   [1, "Team A"],
            [2, "Team B"],
            [3, "Team C"],
            //etc...
        ]
    */
    console.log (newStatTable);
    //alert (newStatTable);
}