web-dev-qa-db-fra.com

Importer le prix actuel du site Web au tableur

Comme vous pouvez probablement le déduire du titre, l’objectif est de brancher le prix actuel de ce produit dans un tableur. Je complique peut-être les choses, mais il doit y avoir un moyen facile de le faire.

Le chemin que j'ai emprunté consiste à utiliser la fonctionnalité IMPORT XML sur GoogleSheets. J'ai l'impression que je suis probablement en train de rencontrer une erreur de syntaxe, je n'arrive tout simplement pas à comprendre. Ma cellule ressemble actuellement à:

=IMPORTXML("http://www.walmart.com/ip/Morton-Sea-Salt-Fine-Salt-17.6-oz/10849552", "id('WM_PRICE')/x:div/x:div/x:span/x:span[2]")

J'ai utilisé une extension pour Firefox appelée Xpath Checker pour extraire le Xpath de l'élément de tarification du site Web, mais l'application ne semble pas approuver. Malheureusement, je n'ai pas trouvé beaucoup de documentation sur l'utilisation de GoogleSheets de cette manière (en tant qu'outil de scrap simple).

MISE À JOUR

J'ai essayé d'importHTML; il semble que le site ait des prix imbriqués entre les lignes 18 et 19. L'utilisation des éléments suivants ne fonctionne donc pas:

=IMPORTHTML("http://www.walmart.com/ip/Morton-Sea-Salt-Fine-Salt-17.6-oz/10849552", "list", 18)

Je sais que le sélecteur unique pour le noeud contenant le prix est

#WM_PRICE > div:nth-child(1)

N'y a-t-il pas moyen de l'utiliser simplement pour syndiquer les informations sur Google Sheets?

RÉSOLUTION

D'accord, j'ai trouvé une solution partielle en utilisant la fonction IMPORTHTML en tant que table, puis en analysant les données et en les découpant selon mes besoins. Il y a probablement une meilleure façon. Ma solution:

=MID(Query(IMPORTHTML("http://www.walmart.com/ip/Morton-Sea-Salt-Fine-Salt-17.6-oz/10849552", "table", 2), "SELECT Col1 LIMIT 1"),8,6)

En modifiant le bit HTTP, je peux maintenant obtenir efficacement le prix de moins de 99,99 $ sur Walmart.com (EDIT: après quelques tests, cela fonctionne uniquement avec FOOD, la mise en page des autres éléments est différente), perdre une décimale. Heureusement, il n’ya pas beaucoup d’articles dont j’ai besoin qui rentrent dans cette catégorie.

Explication de la formule:

Tout d'abord, pour importer les données précieuses, j'ai réalisé l'importation brute avec les éléments suivants:

IMPORTHTML("http://www.walmart.com/ip/Morton-Sea-Salt-Fine-Salt-17.6-oz/10849552", "table", 2)

Cependant, il a importé plusieurs colonnes et lignes, pas de bueno. Je les ai donc coupés en "sélectionnant" la colonne 1 et en "limitant" les lignes à 1.

Query((), "SELECT Col1, LIMIT 1")

Mais cela ne m'a laissé qu'une seule cellule, bouchée: La formule a retourné Word Online avant la valeur $ (et un tas de bric-à-brac après), j'ai donc analysé 8 caractères dans la chaîne et arrêté l'analyse après 6 caractères via la commande MID (heureusement, il n'y avait qu'un seul tampon d'espace après le montant en dollars).

=MID((),8,6)

Et c'est tout. Si quelqu'un d'autre a un moyen plus élégant de le faire, veuillez tout de même commenter. Je voulais juste laisser quelques tremplins à ceux qui voudraient faire quelque chose comme ça à l'avenir.

3
Bill-Skates

L'erreur dans votre importxml était dans la syntaxe xpath. voici le correct:

=CONCATENATE(IMPORTXML("http://www.walmart.com/ip/Morton-Sea-Salt-Fine-Salt-17.6-oz/10849552","//*[@itemprop='price'][1]"))

édité: ajout du [1] à la fin du xpath pour éviter le prix en double.

2
Aurielle Perlmann

En fin de compte, je ne peux pas le faire avec les fonctions de Google. En conséquence, j'ai décidé d'écrire une fonction personnalisée.

enter image description here

Allez à Outils -> Editeur de script. Cliquez "Tableur" à gauche pour créer un nouveau document. Faites défiler et collez le code suivant dans:

enter image description here

function getWalmartPrice(url) {
  var html = UrlFetchApp.fetch(url).getContentText(); //Can't create document element ^_^
  html = html.substring(html.indexOf("bigPriceText1"));
  html = html.substring(html.indexOf(">") + 1);
  var txt = html.substring(0, html.indexOf("<"));
  //same thing for the small price
  html = html.substring(html.indexOf("smallPriceText1"));
  html = html.substring(html.indexOf(">") + 1);
  return txt + html.substring(0, html.indexOf("<"));
};

C'était difficile à écrire (pas de XHR, pas de document, etc.), mais c'est juste un tas de manipulations de chaînes JavaScript pour trouver le contenu des éléments DOM.

enter image description here

Save le fichier - cliquez sur File-> Save, control/command-S ou sur le bouton présenté ci-dessus. Vous serez probablement invité à recevoir de nombreux messages liés aux autorisations, et vous devrez également attribuer un nom au projet (peu importe comment vous l'appelez, tant que le fichier s'appelle Code.gs qu'il est automatiquement). Vous pouvez maintenant revenir à la feuille de calcul et la tester. Rappelez-vous que la fonction est =getWalmartPrice(<url>). Une info-bulle ne s'affiche pas sur les fonctions personnalisées lorsque vous écrivez le nom de la fonction. Par conséquent, ne vous inquiétez pas si elle ne s'affiche pas.

Voici un exemple:

enter image description here

=getWalmartPrice("http://www.walmart.com/ip/Morton-Sea-Salt-Fine-Salt-17.6-oz/10849552")
=getWalmartPrice("http://www.walmart.com/ip/Dell-Pre-Owned-Refurbished-Silver-745-Desktop-PC-with-Intel-Core-2-Duo-Processor-4GB-Memory-750-Hard-Drive-and-Windows-7-Professional-Monitor-Not/21907344")

J'ai inclus le deuxième exemple pour montrer que le code est universel. Cela fonctionne pour des produits de différents départements (électronique) et pour des choses qui coûtent plus de 99,99 $. Le code renvoie correctement $209.18.

Si vous voulez un nombre et non une chaîne, vous pouvez assez facilement changer le code pour extraire uniquement les nombres et pas de chaîne. Vous pouvez faire txt.match(/\d/g).join(""); pour extraire uniquement les nombres d'une chaîne, et bien sûr l'analyser pour effectuer quelques manipulations.

1
Shahar

La configuration suivante renvoie le prix:

A1: http://www.walmart.com/ip/Morton-Sea-Salt-Fine-Salt-17.6-oz/10849552
A2: (//div[@itemprop='price'])[1]
Formule A3: =CONCATENATE(IMPORTXML(A1,A2))
A3 Résultat: $2.35

0
Rubén