Как да заредя таблица от друга уеб страница в масив?

Създавам скрипт Greasemonkey/Tampermonkey, който поставя някои статистики в масив.

Използвайки JavaScript, как да направя така, че страницата да зарежда URL (футбол .fantasysports.yahoo.com/f1/326198/pointsagainst?pos=QB) във фонов режим и създава масив с първите две колони (Rank и Team)?

Проблемът, който имам, е да правя всичко това във фонов режим, предполагам, че ще използвам AJAX. Всяка помощ ще бъде оценена.


person Bijan    schedule 01.09.2015    source източник
comment
Не съм сигурен. Скриптът ще се изпълнява на football.fantasysport.Yahoo.com   -  person Bijan    schedule 01.09.2015
comment
Как трябва да използвам php в скрипт greasemonkey   -  person Bijan    schedule 01.09.2015
comment
Махнете написаното от мен. Greasemonkey ще ви позволи да персонализирате само своя собствен браузър, без достъп до CORS. Каква е твоята цел?   -  person StackSlave    schedule 01.09.2015


Отговори (2)


За статична страница (като този, който сте свързали), използвайте GM_xmlhttpRequest() и DOMParser, за да извлечете елементите, които искате. Виж отдолу.

За динамична страница(задвижвана от AJAX) използвайте техниките от Как да накарам AJAX get-request да изчака страницата, която да бъде изобразена, преди да върне отговор?


Ето пълен скрипт, показващ как да извлечете информация от страница на трета страна и да я превърнете в променлива в масив:

// ==UserScript==
// @name        _Grab stuff of a *static*, third-party web site.
// @include     https://stackoverflow.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);
}
person Brock Adams    schedule 01.09.2015
comment
Как бих променил това, за да получа множество страници от един и същи тип и да ги съхраня в 2D масив. т.е. точно сега получава QB позицията, но какво ще стане, ако искам да получа и Тази страница и я съхранете в масива. Първата колона на масива ще изброява всички отбори, 2-рата колона ще съдържа класирането на отборите за QB позиция, 3-тата колона ще има класирането на отборите за WR позиция и т.н. - person Bijan; 01.09.2015
comment
Бихте използвали отделни GM_xmlhttpRequests за всеки тип таблица (бих го направил функция) и бихте съпоставили различните типове резултати, когато идват асинхронно. ... Това е извън обхвата на този въпрос и ако зададете нов въпрос за него, уверете се, че първо сте направили сериозен опит да го разрешите. - person Brock Adams; 01.09.2015
comment
Публикувах нов въпрос. Идеята ми беше просто да повторя GM_xmlhttpRequest през for цикъл и след това да комбинирам всички масиви след това, но това изглежда неефективно и console.log не работи по някаква причина. - person Bijan; 01.09.2015

Мисля, че искате да направите нещо като:

// ==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
person StackSlave    schedule 01.09.2015
comment
Това има много проблеми, като най-големият е, че получава всяка връзка на всяка преглеждана страница! Моля, тествайте кода си и никога, никога не използвайте @include * или еквивалент. - person Brock Adams; 01.09.2015