J'ai développé ce programme de raclage Web simple pour gratter newegg.com. J'ai fait une boucle pour imprimer le nom du produit, prix et les frais d'expédition.
Cependant, lorsque je cours la boucle pour la boucle, il n'imprime rien et ne me donne aucune erreur. Avant d'écrire la boucle (articles commentés), j'ai couru ces lignes (articles commentés) et imprime les détails uniquement pour l'un des produits. P>
from bs4 import BeautifulSoup import requests import csv source = requests.get('https://www.newegg.com/PS4-Systems/SubCategory/ID-3102').text soup = BeautifulSoup(source, 'lxml') #prod = soup.find('a', class_='item-title').text #price = soup.find('li', class_='price-current').text.strip() #ship = soup.find('li', class_='price-ship').text.strip() #print(prod.strip()) #print(price.strip()) #print(ship) for info in soup.find_all('div', class_='item-container '): prod = soup.find('a', class_='item-title').text price = soup.find('li', class_='price-current').text.strip() ship = soup.find('li', class_='price-ship').text.strip() print(prod.strip()) #price.splitlines()[3].replace('\xa0', '') print(price.strip()) print(ship)
3 Réponses :
@rick Vous avez ajouté à tort un espace supplémentaire dans espère que cela résoudra votre problème ... p> p> pour info dans SOUP.Find_All ('div', classe _ = 'Item-conteneur'): code> cette ligne après la valeur de l'attribut
Vérifiez ci-dessous le code, cela fonctionnera comme vous attendez
Pouvez-vous m'aider avec autre chose? Chaque fois que le code exécute la boucle pour la boucle, il est censé choisir un nouveau produit sur NEWEGG à chaque fois. Cependant, il imprime les mêmes informations pour un seul produit à chaque fois. Comment puis-je réparer cela?
Voir ma réponse ci-dessous
@Rick: Votre erreur (qu'elle imprime toujours le même élément) vient de ne pas utiliser
@Rick Voir les réponses de @niels Henkens et @Loss of Human Identity pour une seule page, pour toutes les 8 pages Augmentation de la page Nombre de page info code> dans le code ci-dessous
pour info dans la soupe .....: code>. Parce que vous utilisez ensuite
soupe.find code> au lieu de
info.find code>, il restera simplement à la recherche de la première occurrence d'E.
Soupe.Find ('a', classe _ = 'item-Title') code>. Si vous utilisez
info.find (....) code> Il utilisera le prochain
page-1 code> jusqu'à 8 dans ce lien
https: // www. newegg.com/ps4-systems/subcategory/id-3102/page- 1? Pagesize = 36 & Commandes = BestMatch code> et itéréter in même pour boucle
Outre la typo "espace" et l'indentation, vous n'avez pas réellement utilisé car votre code n'utilise pas EDIT: strong>
J'ai également constaté que le prix n'est pas toujours le deuxième élément lorsque vous utilisez
Pouvez-vous m'aider à comprendre les .splitlines () [1]. Plus spécifiquement le '[1]'.
.splitlines () crée une liste, où le texte est divisé en différents éléments de la liste. Le [1] est l'index de cette liste, ce qui signifie qu'il faut que le deuxième élément de la liste ([0] est le premier élément). Dans la plupart des cas, le deuxième élément de la division () contient le prix réel. info code> dans votre boucle. Cela continuera à imprimer le premier élément. Utilisez
info code> dans votre boucle où vous avez eu
soupe code>.
info code> dans le code ci-dessous
pour info dans la soupe .....: code> mais
soupe.find (..) code>, il restera simplement à la recherche de la première occurrence d'ex.
Soupe.Find ('a', classe _ = 'item-Title') code>. Si vous utilisez
info.find (....) code> Il utilisera le prochain
.splitlines () code>, parfois c'est le premier. J'ai ajouté un chèque pour voir si l'article contenait le signe '$'. Sinon, il a utilisé le premier élément de la liste. p> p>
écrire moins de code:
Pour commencer, vous avez eu un espace supplémentaire dans
classe _ = 'item-conteneur' code>. Changez cela en
Classe _ = 'Item-Conteneur' Code> Mais je pense que cette page est dynamique afin que vous ayez besoin de faire un travail supplémentaire pour obtenir les données0
@ Chitown88 est correct en signalant la typo qui vous empêchait d'entrer dans la boucle. Mais la boucle est également construite incorrectement, car elle répète les mêmes données pour chaque
div code> que votre
recherche_all code> capture.
ma faute. Ce n'est pas dynamique. Vous n'utilisez jamais d'informations lorsque vous iTERE (comme indiqué dans les solutions ci-dessous)
@ Rick, si la réponse résout votre problème, vous devez le marquer comme accepté