[ImportXML] Xpath vers le prix affiché sur un site

Bonjour,

J'aimerais savoir s'il est possible d'importer sur google sheet le prix d'un objet affiché sur "Banggood" ?

Je cherche une solution depuis déjà quelques heures et après plusieurs essais de Xpath biens différents j'ai enfin réussi à trouver quelque chose qui semble s'approcher le plus du résultat que j'en attend , mais je commence à me demander si c'est une information que l'on peut importer ou non car la fonction m'affiche "00,00$" et ne semble par réussir à avoir le prix visible sur le site ... Si ce que je cherche à faire est bien faisable, auriez-vous une solution à mon problème ?

J'utilise l'extension "import from web" car j'ai l'impression d'arriver plus facilement à un résultat mais je n'y connais sincèrement presque rien..

Voici un screenshoot;

capturexpathproblem

Merci d'avance pour m'avoir lu !

Bonjour,

Peux-tu donner l'url utilisée ?

Un XPath ne peut pas être seulement .main-price !! cela pourrait être par exemple //div[@class='main-price'] ...voir ici https://forum.excel-pratique.com/astuces/google-sheets-importxml-et-xpath-150789

Merci pour la réponse ,

Yep j'ai bien vu qu'un Xpath doit normalement être composé d'une suite comme pour un menu déroulant d'un explorateur de fichier mais après plusieurs essais je n'ai toujours pas compris comment atteindre cette info. J'ai d'abord essayé de simplement copier et coller le xpath depuis l'inspection d'élément mais voila ce que j'obtiens à partir de ça

Importfromweb("Lien";"/html/body/div[3]/div/div[2]/div[2]/div[7]/span[2]" = "#ALL_SELECTORS_RETURN_NULL" )

1er

Ensuite j'ai essayé d'écrire le chemin moi même mais plus d'infos à partir du deuxième div[2] j'ai alors testé pas mal de combinaisons et regardé pas mal de vidéos sans réussir à comprendre le fonctionnement, donc pour l'instant je suis bien d'accord avec vous je sèche sur comment écrire correctement un Xpath !

Je ne peux malheureusement pas envoyer de lien ici ... J'imagine que n'importe quel article fait l'affaire mais c'est le EV800D sur banggood.com

Merci pour le document je viens de le lire et j'en ai déjà lu quelque uns dans le même style mais visiblement il me manque une connaissance de base pour le comprendre correctement, je continue a me renseigner sur le sujet pour essayer de comprendre :/...

Je ne peux malheureusement pas envoyer de lien ici ... J'imagine que n'importe quel article fait l'affaire mais c'est le EV800D sur banggood.com

Oui c'est vrai, mais tu peux mettre un lien vers une copie de ton fichier.

Néanmoins, les fonctions natives de GSheets seront inopérantes car en fait le site est construit côté "client" et non côté "serveur" par javascript. Il faut donc aller décoder le code source (si tant est qu'il ne soit pas lui-même bloqué) par un script pour aller chercher le prix dans cette variable, par exemple pour https://www.banggood.com/fr/800W-Multifunctional-Electric-Health-Kettle-1_6L-Tea-Soup-Stainless-Stee...

    window.ad_product = {
        "id": "1753341",           //"vendor": "",
        "price": "29.99",
        "url": "https://www.banggood.com/fr/800W-Multifunctional-Electric-Health-Kettle-1_6L-Tea-Soup-Stainless-Steel-Household-Decoction-Pot-p-1753341.html",
        "picture": "https://imgaz1.staticbg.com/thumb/view/oaupload/banggood/images/EB/85/1142aa8d-4d1d-4651-b212-71677a02f315.jpg",
        "name": "Bouilloire électrique multifonctionnelle de santé 800W 1.6L pot de décoction de ménage d'acier inoxydable de soupe de thé",
        "category": "",
        };

On peut s'appuyer plutôt sur snapchatData

image

En A1, mets l'url

Ensuite

=prix(A1)

avec comme fonction personnalisée

function prix(url) {
  var source = UrlFetchApp.fetch(url).getContentText()
  var snapchatData = JSON.parse(source.split('var snapchatData = ')[1].split(';')[0])
  return (snapchatData.detail.price + ' ' + snapchatData.detail.currency)
}

Ca fonctionne oui ! Merci beaucoup pour l'aide !

J'ai par contre deux autres soucis avec cette solution :/ . Mais je ne suis pas sur que ce soit réglable ou même si tu as l'envie de te pencher dessus..

Dans le doute je demande quand même :p..

J'essaie de comprendre la fonction pour pouvoir en faire autant qu'il y a d'entrepôt à sélectionner sur la page mais je coince déja...

J'essaie cette fois ci d'utiliser fb_track

var fb_track='track',fb_jsonNewFB={"content_type":"product","size":[],"color":[],"material":[],"pattern":[],"brand":[],"ecomm_site":"pc","content_category":"Home Appliances > Kitchen Appliances > Electric Kettle","content_ids":["1753341-287845US-ESW"],"content_name":"Bouilloire \u00e9lectrique multifonctionnelle de sant\u00e9 800W 1.6L pot de d\u00e9coction de m\u00e9nage d'acier inoxydable de soupe de th\u00e9","value":"29.99","currency":"USD","page_lang":"fr-FR","first_source":"google","campaign":"-","medium":"organic","eventID":"d9b4183709cb289809cd1223f5187ccd6b4885663644a1d4cd80707bb69e1d6b"},fb_event_name='ViewContent';

mais je ne sais pas si c'est bien ce que je dois choisir ... D'ailleurs ça m'arrangerait si le prix était directement en € mais ça m'a l'air tout de suite bien plus compliqué...

capturees

J'essaie donc de faire une fonction personnalisé en faisant mon meilleur copié collé de celle que tu m'as envoyé plus tôt mais j'ai probablement raté quelques étapes car ça m'affiche "erreur"!

Voila ce que j'ai:

function prixes(url) {
  var source = UrlFetchApp.fetch(url).getContentText()
  var fb_track = JSON.parse(source.split('var fb_track = ')[1].split(';')[0])
  return (fb_track.value + ' ' + fb_track.value.currency)
}

Et le deuxième soucis bien moins important mais assez embêtant est que le prix s'affiche sous une forme que sheets ne prend pas en compte comme un nombre à cause du point "10.00 USD". Est il possible de changer les paramètres concernant la virgule ou alors forcer le point à devenir une virgule ?

Merci beaucoup pour l'aide !

Bonjour,

Pour le point est l’euro

function prix(url) {
  var source = UrlFetchApp.fetch(url).getContentText()
  var snapchatData = JSON.parse(source.split('var snapchatData = ')[1].split(';')[0])
  return ((Number((snapchatData.detail.price).replace(/./ig, ",")) * 0.86442) + ' €')
}

Bonne Journée

J'essaie cette fois ci d'utiliser fb_track

var fb_track='track',fb_jsonNewFB={"content_type":"product","size":[],"color":[],"material":[],"pattern":[],"brand":[],"ecomm_site":"pc","content_category":"Home Appliances > Kitchen Appliances > Electric Kettle","content_ids":["1753341-287845US-ESW"],"content_name":"Bouilloire \u00e9lectrique multifonctionnelle de sant\u00e9 800W 1.6L pot de d\u00e9coction de m\u00e9nage d'acier inoxydable de soupe de th\u00e9","value":"29.99","currency":"USD","page_lang":"fr-FR","first_source":"google","campaign":"-","medium":"organic","eventID":"d9b4183709cb289809cd1223f5187ccd6b4885663644a1d4cd80707bb69e1d6b"},fb_event_name='ViewContent';

mais je ne sais pas si c'est bien ce que je dois choisir ... D'ailleurs ça m'arrangerait si le prix était directement en € mais ça m'a l'air tout de suite bien plus compliqué...

Dans cet extrait du code source, je ne vois pas non plus de valeurs en euros.

Si tu veux en effet utiliser cette partie de code source, il faut voir qu'il y a 3 variables

fb_track
fb_jsonNewFB
fb_event_name

et que la seule qui sois sous forme de json est

fb_jsonNewFB={"content_type":"product","size":[],"color":[],"material":[],"pattern":[],"brand":[],"ecomm_site":"pc","content_category":"Home Appliances > Kitchen Appliances > Electric Kettle","content_ids":["1753341-287845US-ESW"],"content_name":"Bouilloire \u00e9lectrique multifonctionnelle de sant\u00e9 800W 1.6L pot de d\u00e9coction de m\u00e9nage d'acier inoxydable de soupe de th\u00e9","value":"29.99","currency":"USD","page_lang":"fr-FR","first_source":"google","campaign":"-","medium":"organic","eventID":"d9b4183709cb289809cd1223f5187ccd6b4885663644a1d4cd80707bb69e1d6b"}

ce qui peut te donner ...

function prix(url) {
  var source = UrlFetchApp.fetch(url).getContentText()
  // il faut être très vigilent que le json soit parfaitement cohérent
  var jsonString = source.split('fb_jsonNewFB=')[1].split('}')[0] + '}'
  var json = JSON.parse(jsonString)
  return ([ json.content_name , json.value.replace(".", ",") , json.currency ])
}

Merci pour la réponse ImoKa, je n'ai malheureusement pas réussi à faire fonctionner la fonction mais finalement elle m'a fait découvrir la fonction "replaceb" qui a soulevé un autre problème étant le "USD" à la fin ... En l'enlevant de la fonction personnalisée le nombre se change automatiquement avec une virgule !

Merci beaucoup pour ton aide Mikhail ! J'essaie de comprendre tout ça demain !

Alors malheureusement je n'ai pas réussi à comprendre ... J'ai essayé de comprendre la fonction et la reproduire sur la section ou le prix en € est affiché mais impossible de m'en sortir la syntaxe est totalement différente à mes yeux et il me manque bien trop de bases.. Je vais continuer à essayer d'apprendre tout ça et je réessayerai une autre fois mais pour le moment ça me dépasse un peu trop..

Merci beaucoup pour votre aide !

Oui, il faut bien comprendre la structure d'un json ... c'est la clé

https://developer.mozilla.org/fr/docs/Learn/JavaScript/Objects/JSON

Rechercher des sujets similaires à "importxml xpath prix affiche site"