0
votes

Le programme de raclage Web pour la boucle ne renvoie rien

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)


4 commentaires

Pour commencer, vous avez eu un espace supplémentaire dans classe _ = 'item-conteneur' . Changez cela en Classe _ = 'Item-Conteneur' 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 que votre recherche_all 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é


3 Réponses :


-2
votes

@rick Vous avez ajouté à tort un espace supplémentaire dans pour info dans SOUP.Find_All ('div', classe _ = 'Item-conteneur'): cette ligne après la valeur de l'attribut Vérifiez ci-dessous le code, cela fonctionnera comme vous attendez xxx

espère que cela résoudra votre problème ...


4 commentaires

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 info dans le code ci-dessous pour info dans la soupe .....: . Parce que vous utilisez ensuite soupe.find au lieu de info.find , il restera simplement à la recherche de la première occurrence d'E. Soupe.Find ('a', classe _ = 'item-Title') . Si vous utilisez info.find (....) Il utilisera le prochain

chaque boucle de la boucle pour la boucle.


@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 page-1 jusqu'à 8 dans ce lien https: // www. newegg.com/ps4-systems/subcategory/id-3102/page- 1? Pagesize = 36 & Commandes = BestMatch et itéréter in même pour boucle



2
votes

Outre la typo "espace" et l'indentation, vous n'avez pas réellement utilisé info dans votre boucle. Cela continuera à imprimer le premier élément. Utilisez info dans votre boucle où vous avez eu soupe . xxx

car votre code n'utilise pas info dans le code ci-dessous pour info dans la soupe .....: mais soupe.find (..) , il restera simplement à la recherche de la première occurrence d'ex. Soupe.Find ('a', classe _ = 'item-Title') . Si vous utilisez info.find (....) Il utilisera le prochain

chaque boucle de la boucle pour la boucle.

EDIT: J'ai également constaté que le prix n'est pas toujours le deuxième élément lorsque vous utilisez .splitlines () , 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.


2 commentaires

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.



2
votes

écrire moins de code: xxx


0 commentaires