2017-10-09 1 views
0

Je racler un dépliant webgrattant un dépliant web

https://flipp.com/flyers/groceries

POSTAL CODE N2L2A1 

Cependant, bien que tous les éléments sont codés en HTML avec les mêmes balises et les noms de classe, je suis incapable de gratter tout en sélénium .

J'ai essayé la méthode find_elements mais je peux toujours gratter une seule valeur, conceptuellement cela ne devrait pas être le cas.

puisque j'utilise le nom de classe commun, tout devrait être listé.

Ce n'est pas le cas ici. Est-ce que je manque quelque chose?

Mon code ressemble à ceci:

driver.find_elements_by_xpath("//html/body/flipp-dialog/div/flipp-toast-container/div/flipp-item-dialog/div/h2/span") 
+0

mes pensées sont ... ressemble à chaque image est un onglet cliquable et tous ces liens cliquables d'étiquette sont données dans une seule page qui est le lien ci-dessus. –

+1

Le lien ne fonctionne pas pour moi - 404 oh oh erreur inattendue –

+0

salut Martin, merci d'avoir essayé. vous pouvez essayer ceci https://flipp.com/flyers/groceries –

Répondre

2

Xpath vous avez choisi est un problème.

  1. Habituellement, vous devriez éviter le xpath absolu. Choisissez plutôt xpath relatif, en commençant par l'élément qui a réellement une signification pour vous.
  2. Assurez-vous de sélectionner un élément qui existe réellement sur la page. Parfois, cela signifie que vous avez besoin de planer ou de cliquer sur quelque chose, avant que cet élément soit disponible. Par exemple, lorsque je cherchais flipp-toast-container sur cette page que vous avez fournis dans le commentaire, tout ce qu'il a est:

    <flipp-toast-container global=""><flipp-toast></flipp-toast><div class="toastable-content"></div></flipp-toast-container> 
    

    Il ne choisirons pas quelque chose de significatif.

Donc, si vous voulez sélectionner chaque nom de prospectus à la page qui les listes (par exemple flipp.com/flyers/groceries), utiliser XPath comme ceci:

//flipp-flyer-listing-item//p[@class="flyer-name"] 

(ie: nous sélectionnez flipp-flyer-listing-item, qui représente le conteneur de chaque prospectus, et choisissez p avec l'attribut @class=flyer-name, nous passons tous les niveaux avec //, car il est seulement important de localiser ces 2 éléments les uns par rapport aux autres, peu importe où ils se trouvent page

Si votre objectif est de gratter réellement le contenu de chaque dépliant (page comme https://flipp.com/flyer/1352064-zehrs-weekly-flyer), vous devez accéder au contenu du dépliant d'abord, puis choisissez chaque élément comme:

//flipp-flyerview//a[@class="item-container"]/div 

Note: il y a aussi méthodes autres que xpath pour choisir l'élément, et je laisse de côté le sujet de la navigation, car cela ne fait pas partie de la question.

+0

whoa! merci Kiril. C'est une excellente explication. –

0

En plus de la correction du localisateur, considérez également que find_elements ... (variant au pluriel) devrait retourner une liste que vous devriez pouvoir parcourir. Compte tenu de cela, vous ne devriez même pas trop suer les compensations.

0

Voici un moyen facile d'analyser les dépliants Flipp. Dans cet exemple, votre navigateur renverra le type de contenu application/json.

https://backflipp.wishabi.com/flipp/items/search?locale=[Your Language preference here]&postal_code=[Your postal code here]&q=[Your merchant here] 

//in this example you will get all items (description, price, image etc..) from all valid flyers from Walmart in in the area of H4A1B9 postal code 

https://backflipp.wishabi.com/flipp/items/search?locale=en-ca&postal_code=H4A1B9&q=Walmart 

//in this example you will search at Walmart for a specifific item 

https://backflipp.wishabi.com/flipp/items/search?locale=en-ca&postal_code=H4A1B9&q=Walmart AND milk 

// dans cet exemple, vous recherchez tous les marchands d'un élément de specifific

https://backflipp.wishabi.com/flipp/items/search?locale=en-ca&postal_code=H4A1B9&q=milk