Grande Quantité d'appels "IMPORTXML" ? solution(s) alternative(s) ?

EDIT : je vais pas refaire un sujet pour ça…. mais est-ce que je peux tronquer les résultats directement depuis ce script ? j'ai besoins que de 2 décimales sur l'ensemble des données pour pouvoir les confronter dans une mise en forme conditionnel ensuite..

Bon..

j'ai essayé des :

var annualPercentageYield = Data[i].annualPercentageYield
var yield = Math.trunc(annualPercentageYield,2)

et par ex: 

var yield = annualPercentageYield.tofixed(2)

etc...

et d'autres petites choses en plus mais je n'arrive pas à tronquer mon pourcentage à deux décimales ^^"

je suis sur que lorsque j'aurais la réponse sous le nez, ça semblera évident

je cogite pour savoir si on ne peut pas récupérer toutes les données comme ici avec ce xpath

//div[@class='et_pb_row']//li/@class|//div[@class='et_pb_row']//span[@class='data']

et sans que l'on ait à spécifier lesquelles dans le script ...

image

je cogite pour savoir si on ne peut pas récupérer toutes les données comme ici avec ce xpath

au début j'avais fait un import XML basique pour tout récupérer mais lorsqu'il n'y avait pas de donnée sur tel ou tel maison, j'avais des décalages de colonnes entre chaque lignes

il y a moyen de s'en sortir avec un script

mais justement je voulais m'essayer avec XmlService.parse , mais pftt le site semble être récalcitrant, après le rejeté *, les a href= sans guillemets, j'ai maintenant des balises <li> non refermées par </li>

ben je vais poursuivre en regex et split !

* & h e l l i p ;

après je peux trier je n'ai pas besoins de tout et donc prendre selon ce que j'ai besoins…. ce n'est dérangeant.

en revanche, une petite curiosité, j'ai suivi le meme process pour autre chose..

 var regExpbuttonreplacementtext = '<div class="button-replacement-text">(.*)<\/div>';
 var regExpTextbutton = '<h2>([A-Za-z ]+)<\/h2>'
image

et j'en ai certaines qui n'ont pas le bon résultat, pourtant la structure est identique, je ne comprend pas !

image

curieux, vérifies qu'il n'y a pas 2 fois button-replacement-text

c'est directement ce que j'ai fait, mais non ce n'est pas ça

je me suis fait un truc de dingue ... obtenir au format json les données des sites, l'avantage du json est que si un élément n'existe pas, le script se hurle pas, donc pas besoin de try/catch

en plus c'était un exercice de regex pas piqué des hannetons

exemple

function myFunction(){
  var data = gatDataAsJson('https://realt.co/product/old-20200-lesure-st-detroit-mi-48235/')
  Logger.log ([data.truc, data.assetAnnualReturn,  data.assetHasTenants, data.assetSection8])
// donne ici [null, 10.09%, Fully Rented, Partial]
}

function gatDataAsJson(marketplaceLink) {
  var fetchedUrl = UrlFetchApp.fetch(marketplaceLink, { muteHttpExceptions: true });
  if (fetchedUrl) {
    var html = fetchedUrl.getContentText().replace(/(\r\n|\n|\r|\t|  )/gm, "")
    if (html.length) {

      var json = {}
      var section = html.match(/(<h3 class="blue-title">Property Highlights<\/h3>(.*)<!-- End of Investor ID -->)/g)[0]
      var sousSections = section.match(/<li class[\s\S\w]+?<\/li>/g)
      sousSections.forEach(function(elem){
        var classe = elem.match(/(<li class([^ ]+))/g)[0].match(/"([^"]+)"/g)[0].slice(1,-1)
        var donnee = elem.match(/<span class="data">([^<]+)</g)[0].match(/>(.*)</g)[0].slice(1,-1)
        json[classe] = donnee
      })
      // Logger.log(JSON.stringify(json))
      return (json)

    }
  }
}

je vais chercher la section où se situent les données

html.match(/(<h3 class="blue-title">Property Highlights<\/h3>(.*)<!-- End of Investor ID -->)/g)[0]

que je découpe en alinéas

var sousSections = section.match(/<li class[\s\S\w]+?<\/li>/g)

dans lesquels je vais chercher la classe de li et les données dans span

je mets tout cela dans un format json

Oh !

je vois le cheminement et ou tu veux en venir. ( j'aime bien me servir de https://regex101.com/ pour comprendre tes extractions ! )

plusieurs questions que je me pose…

à quoi sert "slice" exactement ?

et deuxième question que je me suis posé toute a l'heure.. pourquoi faire plusieurs "match" à suivre ? c'est pour dégrossir l'extraction et limiter les erreurs ?

Du coup je suis même en train de me dire que ce serait plus simple que je récupère tout les liens du site directement plutôt que rajouter la couche API etc...

je vois que tout les liens sont dispo comme ceci :

<link rel="canonical" href="https://realt.co/product/old-20200-lesure-st-detroit-mi-48235/" />

mais c'est intéressant ! je regarde comment le convertir et l'intégrer dans une page Sheets dans l'après midi

le slice(1,-1) permet ici de retirer le premier caractère et le dernier, en l'occurrence pour l'un c'est " et pour l'autre c'est > et <

effectivement les match en cascade c'est pour dégrossir, mais on aurait pu éviter en jouant uniquement avec les slice ici, c'était juste pour faire propre

il y avait plus simple

var classe = elem.match(/(class="([^"]+))/g)[0].slice(7)
var donnee = elem.match(/<span class="data">([^<]+)/g)[0].slice(19)

après je peux trier je n'ai pas besoins de tout et donc prendre selon ce que j'ai besoins…. ce n'est dérangeant.

en revanche, une petite curiosité, j'ai suivi le meme process pour autre chose..

 var regExpbuttonreplacementtext = '<div class="button-replacement-text">(.*)<\/div>';
 var regExpTextbutton = '<h2>([A-Za-z ]+)<\/h2>'
image

et j'en ai certaines qui n'ont pas le bon résultat, pourtant la structure est identique, je ne comprend pas !

image
function buttonReplacementText(){
  marketplaceLink = 'https://realt.co/product/10639-stratman-st-detroit-mi-48224/'
  var fetchedUrl = UrlFetchApp.fetch(marketplaceLink, { muteHttpExceptions: true });
  if (fetchedUrl) {
    var html = fetchedUrl.getContentText().replace(/(\r\n|\n|\r|\t|  )/gm, "")
    if (html.length) {
      Logger.log(html.match('<div class="button-replacement-text"><h2>([^<]+)')[1])
    }
  }
}

encore plus simple

var classe = elem.match(/class="([^"]+)"/)[1]
var donnee = elem.match(/<span class="data">([^<]+)</)[1]

En effet ça fonctionne comme ça !

penses tu que sur ce principe c'est possible de récupérer les liens directement depuis le site ?

le problème c'est qu'il y a des liens dans pleins de pages différentes, mais à chaque fois ça se présente comme ça

<link rel="canonical" href="https://realt.co/product/old-20200-lesure-st-detroit-mi-48235/" />

et en source je peux juste mettre le site de base mais pas sur de trouver grand chose, ça économiserai des appels sur mon API

ces liens se trouvent où ? dans les pages de chaque propriété le lien est le même que l'url !

ces liens se trouvent où ? dans les pages de chaque propriété le lien est le même que l'url !

Ah oui je suis idiot... ce lien dans le code source est simplement le lien de la page.... et pas une info supplémentaire, pour le coup j'ai pas réfléchi !

Les liens sont https://realt.co/marketplace/ pour 15 propriétés et le reste est dans une sous-catégorie (même url) "previous prorperties "

du coup je ne sais pas vraiment comment chercher

function newAlex(){
  url = 'https://realt.co/marketplace/'
  var fetchedUrl = UrlFetchApp.fetch(url, { muteHttpExceptions: true });
  if (fetchedUrl) {
    var html = fetchedUrl.getContentText().replace(/(\r\n|\n|\r|\t|  )/gm, "")
    if (html.length) {
      var regex = /(https:\/\/realt.co\/product\/[^"^']+)/
      Logger.log (ExtractAllRegex(html,regex,1))
    }
  }
}
function ExtractAllRegex(input, pattern,groupId) {
  return Array.from(input.matchAll(new RegExp(pattern,'g')), x=>x[groupId]);
}

J'adore le nom de la fonction

je vais voir comment assembler tout ça et le retranscrire sur ma page , je crois que j'ai tout pour commencer a assembler ce puzzle !

merci !

tu peux aussi faire cela, c'est plus joli !

function newAlex(){
  url = 'https://realt.co/marketplace/'
  var fetchedUrl = UrlFetchApp.fetch(url, { muteHttpExceptions: true });
  if (fetchedUrl) {
    var html = fetchedUrl.getContentText().replace(/(\r\n|\n|\r|\t|  )/gm, "")
    if (html.length) {
      var links = [...html.matchAll(/https:\/\/realt.co\/product\/[^"^']+/g)].flat()
      Logger.log(links)
    }
  }
}

du coup c'est ce que je disais. On récupère ceux de la page, mais ceux dans la sous-rubrique ça doit être diffèrent, ils sont rangés ailleurs

image

je les trouves pas sur le code source du marketplace

Rechercher des sujets similaires à "grande quantite appels importxml solution alternative"