Grande Quantité d'appels "IMPORTXML" ? solution(s) alternative(s) ?
Bonjour ! du coup j'ai pas du tout avancé..
Je ne sais pas comment m'y prendre pour utiliser les liens générés par la fonction "links" et m'en servir pour ensuite récupérer les données grâce a la fonction "getDataAsJson" !
ce teste ne fonctionne pas du tout ^^
function myFunction(){
var data = getDataAsJson(links)
Logger.log ([data.assetAnnualReturn, data.assetRentStartDate, data.assetRentPerToken, data.assetHasTenants, data.assetTokenPrice, data.assetSection8, data.assetSection8Pays])
}
function getDataAsJson(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(/class="([^"]+)"/)[1]
var donnee = elem.match(/<span class="data">([^<]+)</)[1]
json[classe] = donnee
})
// Logger.log(JSON.stringify(json))
return (json)
}
}
}
function links(){
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)
}
}
}Car il faut juste que j'arrive a imbriquer les scripts précèdent pour tout sortir d'un coup en faite
et d'ailleurs je n'ai pas réussi a retrouver les liens de que ce qu'il y a dans " previous properties " .. grand mystère à mon niveau de connaissance
Edit : En faite mon objectif c'est de pouvoir récupérer tout les liens, et avec ces liens prendre toutes les infos du site assez simplement comme pour ça :
j'aime l'idée de mettre simplement les "en-tete" pour prendre le contenue c'est facilement assimilable pour moi.
je vais donc partir de plus haut pour intégrer plus de code source dans le .match au dessus
function myFunction(){
var data = getDataAsJson(links)
Logger.log ([data.assetAnnualReturn, data.assetRentStartDate, data.assetRentPerToken, data.assetHasTenants, data.assetTokenPrice, data.assetSection8, data.assetSection8Pays])
}Bon.... avant de vouloir tout regrouper, avoir tout les liens etc.. je me concentre sur un autre volet a extraire..
Voici le code source :
<h3 class="blue-title">
Property Financials </h3>
<div class="et_pb_row">
<div class="et_pb_column">
<div id="property-financials">
<div class="property-yield-breakdown">
<ul class="property-financials-list tabs-ul">
<!-- Gross Rent -->
<li class="line-item gross-rent-annual">
<h4>
Gross Rent / year <span class="average-notice"></span>
</h4>
<span>$ 290,304.00</span>
</li>
<li class="line-item gross-rent">
<h4>
Gross Rent / month <span class="average-notice"></span>
</h4>
<span>$ 24,192.00</span>
</li>
<!-- Monthly Costs, w/ breakdown -->
<li class="line-item monthly-costs has-fees">
<h4>
Monthly Costs <button type="button" class="fees-toggle line-item"><i class="fas fa-caret-circle-down"></i></button>
</h4>
<span>- $ 8,449.20</span>
<!-- <div class="fees-toggle-wrapper">
<button class="fees-toggle" type="button">Fees</button>
</div> -->
<ul class="property-financials-fees">
<li class="fee-item property-management">
<h5>
<span class="fee-heading">Property Management</span>
<span class="fee-percent">(8.00%)</span>
</h5>
<span class="fee-value">- $ 1,935.36</span>
</li>
<li class="fee-item realt-platform">
<h5>
<span class="fee-heading">RealT Platform</span>
<span class="fee-percent">(2.00%)</span>
</h5>
<span class="fee-value">- $ 483.84</span>
</li>
<li class="fee-item property-maintenance">
<h5>
<span class="fee-heading">Maintenance Expenses</span>
</h5>
<span class="fee-value">- $ 1,450.00</span>
</li>
<li class="fee-item property-taxes">
<h5>
<span class="fee-heading">Property Taxes</span>
</h5>
<span class="fee-value">- $ 2,850.00</span>
</li>
<li class="fee-item property-insurance">
<h5>
<span class="fee-heading">Insurance</span>
</h5>
<span class="fee-value">- $ 690.00</span>
</li>
<li class="fee-item property-utilities">
<h5>
<span class="fee-heading">Utilities</span>
</h5>
<span class="fee-value">
- $ 1,040.00 </span>
</li>
</ul>
</li>
<li class="line-item net-rent-monthly">
<h4>Net Rent / month</h4>
<span>
$ 15,742.80 </span>
</li>
<li class="line-item net-rent-annual line-total">
<h4>Net Rent / year</h4>
<span>
$ 188,913.60 </span>
</li>
<li class="line-total asset-price no-border-top">
<h4>
Total Investment
<button class="realt-tooltip-wrapper total-investment">
<i class="fas fa-info-circle"></i>
<div class="realt-tooltip">
<strong>Total Investment</strong> is currently calculated as <strong>Number of Tokens x Token Price.</strong> As a result of the two-decimal value of the Token Price, Total Investment will typically exhibit a discrepancy of a few cents to a few dollars. </div>
</button>
<button type="button" class="asset-breakdown-toggle line-item">
<i class="fas fa-caret-circle-down"></i>
</button>
</h4>
<span>
$ 1,881,450.00 </span>
<ul class="asset-breakdown line-item">
<li class="fee-item underlying-asset-price">
<h5>Underlying Asset Price</h5>
<span>$ 1,610,000.00</span>
</li>
<li class="fee-item op-expense-reimburse">
<h5>Operating Expense Reimbursement (10%)</h5>
<span>$ 188,153.00</span>
</li>
<li class="fee-item init-maintenance-reserve">
<h5>Initial Maintenance Reserve</h5>
<span>$ 48,384.00</span>
</li>
<li class="fee-item renovation-reserve">
<h5>Initial Renovation Reserve</h5>
<span>$ 35,000.00</span>
</li>
</ul>
</li>
<li class="line-item cap-rate line-total no-border-top ">
<h4>
Expected Income <button class="realt-tooltip-wrapper cap-rate">
<i class="fas fa-info-circle"></i>
<div class="realt-tooltip">
<strong>Expected Income</strong> is calculated as <strong>Net Rent / Total Investment</strong>. It does not include the potential return to token-holders from capital appreciation on the asset itself. </div>
</button>
</h4>
<span>10.04%</span>
<p class="appreciation-not-included">Not including capital appreciation</p>
</li>
</ul>
</div>
</div> <!-- End #property-financials -->Voici le script adapté :
function myFunctionFinancials(){
var data = gatDataAsJsonFinancials('https://realt.co/product/16851-16881-greenfield-rd-detroit-mi-48235/')
Logger.log ([data.gross-rent-annual])
}
function gatDataAsJsonFinancials(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 Financials<\/h3>(.*)<!-- End #property-financials -->)/g)[0]
var sousSections = section.match(/<li class[\s\S\w]+?<\/li>/g)
sousSections.forEach(function(elem){
var classe = elem.match(/class="[^"]+-item ([^"]+)"/)[1]
var donnee = elem.match(/<span>([^<]+)<\/span><\/li>/)[1]
json[classe] = donnee
})
return (json)
}
}
}et j'ignore pourquoi cela ne me récupère pas les infos. pourtant j'isole bien les éléments étape par étape comme précédemment
j'ai fait un doc avec les différents script et avancement.
l'idée final étant de tout retranscrire ensemble.
https://docs.google.com/spreadsheets/d/1puPQ8iQLc6LcdOueFcNlqzSNmho03wbg7g5NDZWydDc/edit?usp=sharing
ceci data.gross-rent-annual ne va pas du tout à cause des tirets ! mettre
Logger.log ([data['gross-rent-annual']])ensuite, il y a des cas où il ne trouve pas la valeur ... pour le moment je décoince en mettant un peu de détail pour investiguer
function myFunctionFinancials(){
var data = gatDataAsJsonFinancials('https://realt.co/product/16851-16881-greenfield-rd-detroit-mi-48235/')
Logger.log ([data['gross-rent-annual']])
}
function gatDataAsJsonFinancials(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 Financials<\/h3>(.*)<!-- End #property-financials -->)/g)[0]
var sousSections = section.match(/<li class[\s\S\w]+?<\/li>/g)
sousSections.forEach(function(elem){
Logger.log("sous-section = " + elem)
Logger.log("classe = " + elem.match(/class="[^"]+-item ([^"]+)"/))
Logger.log("donnée = " + elem.match(/<span>([^<]+)<\/span><\/li>/))
var classe = elem.match(/class="[^"]+-item ([^"]+)"/)[1]
try {var donnee = elem.match(/<span>([^<]+)<\/span><\/li>/)[1]} catch(e){donnee=''}
json[classe] = donnee
})
return (json)
}
}
}comme cela tu peux voir là où c'est "null"
13:36:00 Infos sous-section = <li class="line-item gross-rent-annual"><h4>Gross Rent / year <span class="average-notice"></span></h4><span>$ 290,304.00</span></li>
13:36:00 Infos classe = class="line-item gross-rent-annual",gross-rent-annual
13:36:00 Infos donnée = <span>$ 290,304.00</span></li>,$ 290,304.00
13:36:00 Infos sous-section = <li class="line-item gross-rent"><h4>Gross Rent / month <span class="average-notice"></span></h4><span>$ 24,192.00</span></li>
13:36:00 Infos classe = class="line-item gross-rent",gross-rent
13:36:00 Infos donnée = <span>$ 24,192.00</span></li>,$ 24,192.00
13:36:00 Infos sous-section = <li class="line-item monthly-costs has-fees"><h4>Monthly Costs<button type="button" class="fees-toggle line-item"><i class="fas fa-caret-circle-down"></i></button></h4><span>- $ 8,449.20</span><!-- <div class="fees-toggle-wrapper"><button class="fees-toggle" type="button">Fees</button></div> --><ul class="property-financials-fees"><li class="fee-item property-management"><h5><span class="fee-heading">Property Management</span><span class="fee-percent">(8.00%)</span></h5><span class="fee-value">- $ 1,935.36</span></li>
13:36:00 Infos classe = class="line-item monthly-costs has-fees",monthly-costs has-fees
13:36:00 Infos donnée = null
13:36:00 Infos sous-section = <li class="fee-item realt-platform"><h5><span class="fee-heading">RealT Platform</span><span class="fee-percent">(2.00%)</span></h5><span class="fee-value">- $ 483.84</span></li>
13:36:00 Infos classe = class="fee-item realt-platform",realt-platform
13:36:00 Infos donnée = null
13:36:00 Infos sous-section = <li class="fee-item property-maintenance"><h5><span class="fee-heading">Maintenance Expenses</span></h5><span class="fee-value">- $ 1,450.00</span></li>
13:36:00 Infos classe = class="fee-item property-maintenance",property-maintenance
13:36:00 Infos donnée = null
13:36:00 Infos sous-section = <li class="fee-item property-taxes"><h5><span class="fee-heading">Property Taxes</span></h5><span class="fee-value">- $ 2,850.00</span></li>
13:36:00 Infos classe = class="fee-item property-taxes",property-taxes
13:36:00 Infos donnée = null
13:36:00 Infos sous-section = <li class="fee-item property-insurance"><h5><span class="fee-heading">Insurance</span></h5><span class="fee-value">- $ 690.00</span></li>
13:36:00 Infos classe = class="fee-item property-insurance",property-insurance
13:36:00 Infos donnée = null
13:36:00 Infos sous-section = <li class="fee-item property-utilities"><h5><span class="fee-heading">Utilities</span></h5><span class="fee-value">- $ 1,040.00</span></li>
13:36:00 Infos classe = class="fee-item property-utilities",property-utilities
13:36:00 Infos donnée = null
13:36:00 Infos sous-section = <li class="line-item net-rent-monthly"><h4>Net Rent / month</h4><span>$ 15,742.80</span></li>
13:36:00 Infos classe = class="line-item net-rent-monthly",net-rent-monthly
13:36:00 Infos donnée = <span>$ 15,742.80</span></li>,$ 15,742.80
13:36:00 Infos sous-section = <li class="line-item net-rent-annual line-total"><h4>Net Rent / year</h4><span>$ 188,913.60</span></li>
13:36:00 Infos classe = class="line-item net-rent-annual line-total",net-rent-annual line-total
13:36:00 Infos donnée = <span>$ 188,913.60</span></li>,$ 188,913.60
13:36:00 Infos sous-section = <li class="line-total asset-price no-border-top"><h4>Total Investment<button class="realt-tooltip-wrapper total-investment"><i class="fas fa-info-circle"></i><div class="realt-tooltip"><strong>Total Investment</strong> is currently calculated as <strong>Number of Tokens x Token Price.</strong>As a result of the two-decimal value of the Token Price, Total Investment will typically exhibit a discrepancy of a few cents to a few dollars.</div></button><button type="button" class="asset-breakdown-toggle line-item"><i class="fas fa-caret-circle-down"></i></button></h4><span>$ 1,881,450.00</span><ul class="asset-breakdown line-item"><li class="fee-item underlying-asset-price"><h5>Underlying Asset Price</h5><span>$ 1,610,000.00</span></li>
13:36:00 Infos classe = class="fee-item underlying-asset-price",underlying-asset-price
13:36:00 Infos donnée = <span>$ 1,610,000.00</span></li>,$ 1,610,000.00
13:36:00 Infos sous-section = <li class="fee-item op-expense-reimburse"><h5>Operating Expense Reimbursement (10%)</h5><span>$ 188,153.00</span></li>
13:36:00 Infos classe = class="fee-item op-expense-reimburse",op-expense-reimburse
13:36:00 Infos donnée = <span>$ 188,153.00</span></li>,$ 188,153.00
13:36:00 Infos sous-section = <li class="fee-item init-maintenance-reserve"><h5>Initial Maintenance Reserve</h5><span>$ 48,384.00</span></li>
13:36:00 Infos classe = class="fee-item init-maintenance-reserve",init-maintenance-reserve
13:36:00 Infos donnée = <span>$ 48,384.00</span></li>,$ 48,384.00
13:36:00 Infos sous-section = <li class="fee-item renovation-reserve"><h5>Initial Renovation Reserve</h5><span>$ 35,000.00</span></li>
13:36:00 Infos classe = class="fee-item renovation-reserve",renovation-reserve
13:36:00 Infos donnée = <span>$ 35,000.00</span></li>,$ 35,000.00
13:36:00 Infos sous-section = <li class="line-item cap-rate line-total no-border-top "><h4>Expected Income<button class="realt-tooltip-wrapper cap-rate"><i class="fas fa-info-circle"></i><div class="realt-tooltip"><strong>Expected Income</strong> is calculated as <strong>Net Rent / Total Investment</strong>.It does not include the potential return to token-holders from capital appreciation on the asset itself.</div></button></h4><span>10.04%</span><p class="appreciation-not-included">Not including capital appreciation</p></li>
13:36:00 Infos classe = class="line-item cap-rate line-total no-border-top ",cap-rate line-total no-border-top
13:36:00 Infos donnée = null
13:36:00 Infos [$ 290,304.00]du coup, à voir si enlever le </li> n'est pas mieux!
function gatDataAsJsonFinancials(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 Financials<\/h3>(.*)<!-- End #property-financials -->)/g)[0]
var sousSections = section.match(/<li class[\s\S\w]+?<\/li>/g)
sousSections.forEach(function(elem){
Logger.log("sous-section = " + elem)
Logger.log("classe = " + elem.match(/class="[^"]+-item ([^"]+)"/))
Logger.log("donnée = " + elem.match(/<span>([^<]+)<\/span>/))
var classe = elem.match(/class="[^"]+-item ([^"]+)"/)[1]
try {var donnee = elem.match(/<span>([^<]+)<\/span>/)[1]} catch(e){donnee=''}
json[classe] = donnee
})
return (json)
}
}
}ceci data.gross-rent-annual ne va pas du tout à cause des tirets !
ahhhhhh et on peut gérer les espaces aussi en mettant entre crochets ?
punaise c'était si simple...
merci :) je retourne dessus tout à l'heure !
oui
en général, tu peux mettre sous crochets, là ce sera toujours bon
la notation avec un . est réservé à de alphanumérique pur qui ne commence pas par un chiffre !
function myFunctionFinancials(){
var data = gatDataAsJsonFinancials('https://realt.co/product/16851-16881-greenfield-rd-detroit-mi-48235/')
Logger.log ([data['init-maintenance-reserve']])
}
function gatDataAsJsonFinancials(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(/(<div id="property-financials">(.*)<li class="line-item cap-rate line-total no-border-top ">)/g)[0]
var sousSections = section.match(/class[\s\S\w]+?<\/li>/gm)
sousSections.forEach(function(elem){
var classe = elem.match(/class="[^"]+-item ([^"]+)"/)[1]
Logger.log(classe)
try{var donnee = elem.match(/<span class="fee-value">([^<]+)<\/span>/)[1];} catch(e){donnee = elem.match(/<span>([^<]+)<\/span>/)[1]}
Logger.log(donnee)
json[classe] = donnee
})
return (json)
}
}
}
Seulement 2 que j'ai pas après vérification je vais chercher
pour le premier je comprend pas. il est identique aux autres..
et le deuxieme n'a pas exactement la meme structure... il n'a pas de "class" devant la donnée ( ça m'arrange pas.. )
Bonjour !
pour le premier je comprend pas. il est identique aux autres..
alors une partie de mon mystère... c'est surement a cause du flag..
var classe = elem.match(/class="[^"]+-item ([^"]+)"/g)[1]
var classe = elem.match(/class="[^"]+-item ([^"]+)"/)[1]
Sur le premier je trouve celui qui me manque. et sur le deuxième j'ai tout sauf celui qui me manque
Enlève le [1] dans les 2 cas pour voir la réponse sous forme de tableau
Enlève le [1] dans les 2 cas pour voir la réponse sous forme de tableau
Ok je me note ça.
je verrais pour retranscrire tout dans un tableau une fois que j'aurais réussi a prendre tout ce que je veux ( sans trop faire de script )
à l'heure actuel je suis pas si mal.
-il faut que je comprenne pourquoi cette donnée n'est pas récupérable comme les autres.
-il faut que je trouve les liens des "previous properties" mais la je sèche complément
et après je verrais
Assez improbable.
Ici j'obtiens 10 éléments sur 16 au total...
var classe = elem.match(/class="fee-[\w]+.([^"]+)">/)[1]
et avec ceci j'obtiens les 6 derniers éléments
var classe = elem.match(/class="line-[\w]+.([^"]+)">/)[1]
Donc en toute logique je devrais faire :
try{var classe = elem.match(/class="fee-[\w]+.([^"]+)">/)[1]}catch(e){classe = elem.match(/class="line-[\w]+.([^"]+)">/)[1]}et bien il me manque quand même des éléments
si vous avez une explication.. moi je vois pas
mon explication est que tu deviens un vrai pro
l'autre explication est que try/catch fonctionne en cas d'erreur ... peut-être faut-il aussi tester si le contenu est vide ou null !
voire peut-être
try{var classe1 = elem.match(/class="fee-[\w]+.([^"]+)">/)[1]}
catch(e){classe1 = '??'}
try{var classe2 = elem.match(/class="line-[\w]+.([^"]+)">/)[1]}
catch(e){classe2 = '??'}mon explication est que tu deviens un vrai pro
Ah ah j'ai une grande marge de progression encore..
a quoi servent les '??'
'??' juste pour signaler que là il y a en effet une erreur !
après tu peux mettre
classe = (classe1 == '??') ? classe2 : classe1try{var classe1 = elem.match(/class="fee-[\w]+.([^"]+)">/)[1]}
catch(e){classe1 = '??'}
try{var classe2 = elem.match(/class="line-[\w]+.([^"]+)">/)[1]}
catch(e){classe2 = '??'}le résultat est identique à ce que j'ai mis au dessus finalement c'est a dire a la place des cases blanches, des simples '?'
Donc oui je vais essayer de cumuler 2 classes séparément il faut juste que je trouve comment
Victoire !
function myFunctionFinancials(){
var data = gatDataAsJsonFinancials('https://realt.co/product/16851-16881-greenfield-rd-detroit-mi-48235/')
Logger.log ([data['class="fee-item renovation-reserve"']])
}
function gatDataAsJsonFinancials(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(/(<div id="property-financials">(.*)<li class="line-item cap-rate line-total no-border-top ">)/g)[0]
var sousSections = section.match(/class="fee-item.*?[0-9]+?<\/span>|class="line-item.*?[0-9]+?<\/span>|class="line-total.*?[0-9]+?<\/span>/g)
sousSections.forEach(function(elem){
var classe = elem.match(/class="fee-item.([^"]*?)"|class="line-item.([^"]*?)"|class="line-total.([^"]*?)"/g)
Logger.log(classe)
try{var donnee = elem.match(/<span class="fee-value">([^<]+)<\/span>/)[1];} catch(e){donnee = elem.match(/<span>([^<]+)<\/span>/)[1]}
Logger.log(donnee)
json[classe] = donnee
})
return (json)
}
}
}j'ai enfin tout mes éléments !
Bon...
On rentre dans le dur maintenant = Assemblage ! et la je vais avoir besoin d'aide car je vois pas comment m'y prendre.
function link(){
url = 'https://realt.co/fr/place-de-marche/'
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)
}
}
}Ce script me génère des liens. je souhaiterai utiliser ces liens dans mes autres scripts directement ( pour ne pas devoir mettre un lien manuellement a chaque fois)
j'ai tout ça à assembler
Individuellement tout est ok.. l'heure de la fusion arrive
Bonjour.
Bon alors… voici ma réflexion pour finaliser tout ça…
je part du script générant les liens du marketplace pour remplir ma colonne "A"
et je me sert de cette colonne "A" comme source pour les autres scripts, c'est juste ? ou j'ai un moyen de tout faire d'un coup ?
Au besoins je peux mettre ici les 6 scripts que j'ai individuellement.
bonne journée


