2017-09-20 1 views
0

Je suis nouveau sur Python et j'essaie d'écrire du code qui récupère des informations sur un site web. J'ai actuellement:Grattage d'un ascenseur avec Python et BeautifulSoup

from bs4 import BeautifulSoup 
import requests 

headers = {'User-Agent': 'Mozilla/5.0'} 

for i in range(1, 300): 
    url = "[REMOVED]/footwear?page=%s" % i 

response = requests.get(url, headers=headers) 
soup = BeautifulSoup(response.text, "html.parser") 
items = soup.find_all('div', 'product-block__info') 
for item in items: 
    for val in item.find_all('a','product-block'): 
     stock = item.find_all('class','count_product_stock hidden')[0].text 
     brand = item.find_all('div','brand')[0].text 
     price = item.find_all('span','selling_price')[0].text 

    print (items) 

Qui renvoie l'erreur IndexError: list index out of range. Si je mets 'product-block__info' à la place de 'product-block', alors je suis capable d'imprimer la liste complète du contenu dans la balise 'product-block__info' sur la page, mais je voudrais juste sélectionner une poignée d'éléments et de les retourner. Est-ce que quelqu'un peut m'expliquer ce qui se passe ici et comment puis-je sélectionner seulement les éléments que je veux dans 'product-block__info'?

+0

L'URL serait utile afin que nous puissions comprendre les noms des classes, etc. – ADug

+0

essayer 'soup.find_all ('div', classe _ = 'produit block__info')' – ADug

+0

Remplacer mon code avec l'ISN ci-dessus » t avoir des changements perceptibles dans les résultats? –

Répondre

1

Lors de la sélection des attributs avec find_all vous devez soit utiliser le dictionnaire attrs ou keyword arguments, sinon bs4 est lookink pour les balises.

for i in range(1, 300): 
    url = "[REMOVED]/footwear?page=%s" % i 
    response = requests.get(url, headers=headers) 
    soup = BeautifulSoup(response.text, "html.parser") 
    items = soup.find_all('div', class_='product-block__info') 
    for item in items: 
     stock = item.find('span', class_='count_product_stock hidden').text 
     brand = item.find('h4', class_='brand').text 
     price = item.find('span', class_='selling_price').text 
     print(stock, brand, price) 
+0

Fantastique, merci pour votre réponse rapide! –

+0

Toujours heureux d'aider :) –