Comment importer des données pas présente dans le code source ?

Bonjour,

J'ai des données que je vois pas dans le code source (ctrl+U) mais je les vois dans la console (ctrl+Maj+I). Je voudrais les importer dans un GS.

Code source, les données sont présente en l1191 avec le script game_stats_load_best_scores_ever('towns_fr_jr');

image

La console:

image

J'ai essayé de faire IMPORTXML(url;requete), mais il me dit que le contenu XML n'est pas valide.

Le script : https://www.jeux-geographiques.com/plugins/vp_game_stats/game_stats.js (utilise la librairie jQuery).

J'espère que vous pourrez m'aider à résoudre ce problème.

https://docs.google.com/spreadsheets/d/1eAwnMLm_L9-3RqN-RhBcXXBBXrK8BwLYVNNAmbffWuA/edit#gid=2023200...

Bonne Journée

Bonjour,

Impossible par les méthodes traditionnelles car le site est construit en javascript côté utilisateur et non construit côté serveur. Qui plus est, le site utilise une méthode asynchrone (et non un json comme dans certains sites).

La console voit le site après exécution du javascript, ce n'est pas le cas de GSheets.

Tout ce que l'on peut voir, c'est que la fonction dont tu parles game_stats_load_best_scores_ever fait partie du code js https://www.jeux-geographiques.com/plugins/vp_game_stats/game_stats.js

function game_stats_load_best_scores_ever(game_special_id){

    $("#game_stats_best_scores_ever_content_result").delay(600, "myQueue").queue("myQueue", function(){ 

        $('#game_stats_best_scores_ever_content_result').load('cache/best_scores_ever_'+game_special_id+'.html', 
            function() {
                avatar_refresh();
            });

    }).dequeue("myQueue");

}

tu dois donc utiliser https://www.jeux-geographiques.com/cache/best_scores_ever_towns_fr_jr.html avec

=importhtml("https://www.jeux-geographiques.com/cache/best_scores_ever_towns_fr_jr.html";"table";1)

j'ai ajouté un onglet avec mon pseudo

accessoirement, tu en es où sur le formulaire de notre ami Patrick Baylou ?

Merci,

J'ai le formulaire arrêté pour l'instant. L'import de données ne marchais pas.

Est-ce possible d'en faire une macro ?

Est-ce possible d'en faire une macro ?

de quoi ? des données ... je ne fais jamais de macro quand je peux faire par des formules ! je n'en vois pas l'intérêt

mais tu peux t'amuser à tester/adapter ceci ...

function importTableHTML(url) {
  var html = '<table' + UrlFetchApp.fetch(url).getContentText().match(/(?<=\<table).*(?=\<\/table)/g) + '</table>';
  var trs = [...html.matchAll(/<tr[\s\S\w]+?<\/tr>/g)];
  var data = [];
  for (var i=0;i<trs.length;i++){
    var tds = [...trs[i][0].matchAll(/<(td|th)[\s\S\w]+?<\/(td|th)>/g)];
    var prov = [];
    for (var j=0;j<tds.length;j++){
      donnee=tds[j][0].match(/(?<=\>).*(?=\<\/)/g)[0].replace(/ /g,' ');
      if(donnee.indexOf("</a>")>-1){
        prov.push(donnee.match(/(?<=\>).*(?=\<\/)/g)[0]);
      }else{
        prov.push(donnee);
      }
    }
    data.push(prov);
  }
  return(data);
}

Merci,

C'était sa que je pensais.

N'oublie pas de clore le fil de discussion en cliquant sur

Je teste la macro et c'est bon.

ça marche ici https://stackoverflow.com/questions/67790221/replacing-importhtml-with-urlfetchapp/67807779#67807779 mais il faut vérifier la configuration exacte du site car ce n'est pas un site normalement directement accessible, étant donné qu'il ne comporte pas les identifiants doctype/html/body ...

Bon, j'ai testé et sa ne marche pas.

Dommage,

J'utilise

=IMPORTXML("https://www.jeux-geographiques.com/cache/best_scores_ever_towns_fr_jr.html";"//table[@class='table table-striped table-hover table-condensed table-responsive table_scores']//td[@class='rank']")

Pour pas avoir le code de l'avatar en plus.

Bon, j'ai testé et sa ne marche pas.

Dommage,

toi qui connais le javascript, tu peux adapter au cas de table incomplète

de toute façon, le mieux est une fonction native de google sheets quand on peut

n'oublie pas de clore ce fil de discussion en cliquant sur

Pas de problème pour fermer la discussion, j’attendais ta réponse.

Bon, j'ai testé et sa ne marche pas.

Dommage,

il suffisait d'adapter le code

function importTableHTML(url) {
  var html = UrlFetchApp.fetch(url).getContentText()
  var trs = [...html.matchAll(/<tr[\s\S\w]+?<\/tr>/g)];
  var data = [];
  for (var i=0;i<trs.length;i++){
    var tds = [...trs[i][0].matchAll(/<(td|th)[\s\S\w]+?<\/(td|th)>/g)];
    var prov = [];
    for (var j=0;j<tds.length;j++){
      donnee=tds[j][0].match(/(?<=\>).*(?=\<\/)/g)[0].replace(/ /g,' ');
      donnee=stripTags(donnee)
      if(j==1){donnee=donnee.match(/(?<= ).*/g)[0]}
      prov.push(donnee);
    }
    data.push((prov));
  }
  return(data);
}
function stripTags(body) {
  var regex = /(<([^>]+)>)/ig;
  return body.replace(regex,"");
}

Bonjour Mikhail,

J’ai une liste de +160 url ce qui veux dire +480 d’IMPORTXML.

Aurais-tu en script qui import les données.

Bonne Journée

le script est celui-ci pour une url

function importTableHTML(url) {
  var html = UrlFetchApp.fetch(url).getContentText()
  var trs = [...html.matchAll(/<tr[\s\S\w]+?<\/tr>/g)];
  var data = [];
  for (var i=0;i<trs.length;i++){
    var tds = [...trs[i][0].matchAll(/<(td|th)[\s\S\w]+?<\/(td|th)>/g)];
    var prov = [];
    for (var j=0;j<tds.length;j++){
      donnee=tds[j][0].match(/(?<=\>).*(?=\<\/)/g)[0].replace(/ /g,' ');
      donnee=stripTags(donnee)
      if(j==1){donnee=donnee.match(/(?<= ).*/g)[0]}
      prov.push(donnee);
    }
    data.push((prov));
  }
  return(data);
}
function stripTags(body) {
  var regex = /(<([^>]+)>)/ig;
  return body.replace(regex,"");
}

on peut balayer les 160, mais auparavant comment veux tu les résultats ? sur des onglets séparés, ou sur un même onglet à la file (et avec repérage de l'url ?)?

Le même onglet.

en F1

=plus(H2:H162)

code

var data = [];
function plus(urls){
  urls.forEach(function(url){importTableHTML(url)})
  return(data);
}
function importTableHTML(url) {
try{
  var html = UrlFetchApp.fetch(url).getContentText()
  var trs = [...html.matchAll(/<tr[\s\S\w]+?<\/tr>/g)];
  //var data = [];
  for (var i=1;i<trs.length;i++){
    var tds = [...trs[i][0].matchAll(/<(td|th)[\s\S\w]+?<\/(td|th)>/g)];
    var prov = [];
    for (var j=0;j<tds.length;j++){
      donnee=tds[j][0].match(/(?<=\>).*(?=\<\/)/g)[0].replace(/ /g,' ');
      donnee=stripTags(donnee)
      if(j==1){donnee=donnee.match(/(?<= ).*/g)[0]}
      prov.push(donnee);
    }
    data.push((prov));
  }}catch(e){}
  //return(data);
}
function stripTags(body) {
  var regex = /(<([^>]+)>)/ig;
  return body.replace(regex,"");
}

Merci, je teste sa dans quelques jours.

Bonjour,

J'ai testé...

C'est génial !!!

Rechercher des sujets similaires à "comment importer donnees pas presente code source"