Import XML yahoo finance

Bonjour,

Dans google sheet, je souhaiterais importer les données du tableau présent dans cette page dont le lien se trouve dans le fichier joint (désolé je ne peux pas encore poster de lien directement) :

38lien.docx (11.16 Ko)

J'ai essayé un import HTML, mais le tableau est introuvable.

J'ai découvert qu'il y avait une fonction importXML, j'ai voulu l'utiliser, mais en copiant l'Xpath (après avoir cliqué sur inspecter sur chrome) cela ne fonctionne pas. Il y a une erreur.

Pouvez-vous m'aider svp ?

Merci d'avance,

Maxos.

Bonjour et bienvenue,

ImportHTML, ImportXML seront inefficaces sur ce site. Pourquoi ? parce que la page web est construite côté client en javascript et non côté serveur. Reste que pour yahoo, on a de la chance, les données de base sont transmises avec la page sous forme d'un ultra-big-json que tu peux voir en cherchant le terme root.App.main dans le code source de la page à la ligne 50.

image

Il faut donc d'abord extraire le json complet et ensuite de parser.

    var source = UrlFetchApp.fetch(url).getContentText()
    var jsonString = source.match(/(?<=root.App.main = ).*(?=}}}})/g) + '}}}}'
    var data = JSON.parse(jsonString)

Ce json contient plus de 15000 informations avec 18 niveaux de nomenclature.

Par ailleurs, il n'y a pas qu'un seul tableau sur la page, mais une fusion d'une multitude de tableaux dont l'accès se fait par

data.context.dispatcher.stores.QuoteTimeSeriesStore.timeSeries.annualNetIncome
data.context.dispatcher.stores.QuoteTimeSeriesStore.timeSeries.annualDilutedAverageShares
data.context.dispatcher.stores.QuoteTimeSeriesStore.timeSeries.annualInterestExpense
data.context.dispatcher.stores.QuoteTimeSeriesStore.timeSeries.annualSellingGeneralAndAdministration
data.context.dispatcher.stores.QuoteTimeSeriesStore.timeSeries.annualOperatingExpense
data.context.dispatcher.stores.QuoteTimeSeriesStore.timeSeries.annualDilutedEPS
data.context.dispatcher.stores.QuoteTimeSeriesStore.timeSeries.annualEbitda
data.context.dispatcher.stores.QuoteTimeSeriesStore.timeSeries.annualNetIncomeContinuousOperations
data.context.dispatcher.stores.QuoteTimeSeriesStore.timeSeries.annualCostOfRevenue
data.context.dispatcher.stores.QuoteTimeSeriesStore.timeSeries.annualTotalRevenue
data.context.dispatcher.stores.QuoteTimeSeriesStore.timeSeries.annualBasicEPS
data.context.dispatcher.stores.QuoteTimeSeriesStore.timeSeries.annualOtherIncomeExpense
data.context.dispatcher.stores.QuoteTimeSeriesStore.timeSeries.annualNetIncomeCommonStockholders
data.context.dispatcher.stores.QuoteTimeSeriesStore.timeSeries.annualOperatingIncome
data.context.dispatcher.stores.QuoteTimeSeriesStore.timeSeries.annualGrossProfit
data.context.dispatcher.stores.QuoteTimeSeriesStore.timeSeries.annualBasicAverageShares
data.context.dispatcher.stores.QuoteTimeSeriesStore.timeSeries.annualPretaxIncome
data.context.dispatcher.stores.QuoteTimeSeriesStore.timeSeries.annualTaxProvision

reste à savoir de quel(s) tableau(x) tu as besoin ...

Bonjour,

Whaou, merci pour cette réponse incroyable.

Malheureusement ce n'est pas de mon niveau :(

j'ai testé d'importer un tableau avec ce code :

 var spreadsheet = SpreadsheetApp.getActive();
  spreadsheet.getRange('A1').activate();
  var source = UrlFetchApp.fetch("mon url").getContentText()
  var jsonString = source.match(/(?<=root.App.main = ).*(?=}}}})/g) + '}}}}'
  var data = JSON.parse(jsonString)
  var donnee=data.context.dispatcher.stores.QuoteTimeSeriesStore.timeSeries.annualDilutedAverageShares
  spreadsheet.getCurrentCell().setValue(donnee);

malheureusement le résultat est mauvais.

en fait dans l'idéal j'aurais souhaité récupérer exactement ce tableau :

googlesheet

Mais je crains que cela soit vraiment compliqué :(

Ce n'est pas forcément compliqué, je dirais même simple avec quelques lignes ... mais cela va me demander une peu de disponibilité. J'essaie de répondre ce soir.

C'est vraiment très gentil.

Par ailleurs, comment avez-vous trouvé tous les accès aux tableaux ?

J'ai décrypté plusieurs fois des json avec excel, GSheets ou firefox, et puis j'ai pas mal travaillé sur yahoo, j'ai fouillé, je finis par connaître, mais c'est pas simple du tout ! avec plus de 15000 données transférées via le json ...

J'ai fini par faire un programme qui est ici https://forum.excel-pratique.com/astuces/google-sheets-importer-un-json-152621#p942890.

Il y a aussi une usine à gaz sur GitHub https://github.com/bradjasper/ImportJSON que j'ai abandonnée tellement c'est complexe !

J'ai fait au mieux ...

let result=[]
function getData(url,donnees){
  var radical = 'data.context.dispatcher.stores.QuoteTimeSeriesStore.timeSeries'
  var xpath=['dataId','asOfDate','periodType','currencyCode','reportedValue.raw','reportedValue.fmt']
  if (typeof donnees == 'object'){var tableaux = donnees.join().split(",")} else {var tableaux = donnees.split("|")}
  var source = UrlFetchApp.fetch(url).getContentText()
  var jsonString = source.match(/(?<=root.App.main = ).*(?=}}}})/g) + '}}}}'
  var data = JSON.parse(jsonString)
  tableaux.forEach(function(tableau){
    var json = eval(radical+'.'+tableau)
    xpath.forEach(function(way){
      var prov=[]
      prov.push(tableau)
      prov.push(way)
      for(var i=0; i<json.length;i++){
        try{
          prov.push(eval(radical+'.'+tableau+'['+i+']'+'.'+way))
        }
        catch(e) {
          prov.push('?');
        }
      }
      result.push(prov)
    })
  })
  return result
}

Les paramètres sont en colonne A

La formule miracle est en C2

image

https://docs.google.com/spreadsheets/d/1wh6JzXG8YJiipDBsuF_kgsrgHHtMxT9Co_rDCYplOU8/copy

Mille merci !

Je vais jeter un oeil :)

Merci encore

Rechercher des sujets similaires à "import xml yahoo finance"