2017-09-23 2 views
0

Je suis en train de gratter Amazon et essayait d'obtenir le prix d'un article dans une page, le fait est pas tous les éléments dans une page Amazon ont un prix si parfois, il peut se révéler qu'elle équivaut à AucunDonner de la valeur par défaut si .Find est égal à aucun Python 3

import requests 
from bs4 import BeautifulSoup 
import itertools 

def spider(max_pages): 
    search = str(input("Search whatever you want and I'll find it on Amazon ")) 
    print("\n") 
    page = 1 
    while page <= max_pages: 
    url = "https://www.amazon.it/s/ref=sr_pg_"+ str(page) + "?rh=n%3A425916031%2Ck%3A" + search + "&page="+ str(page) + "&sort=relevancerank&keywords=" + search 
    source_code = requests.get(url) 
    plain_text = source_code.text 
    soup = BeautifulSoup(plain_text, "html.parser") 
    for link in soup.findAll("a", {"class": "s-access-detail-page"}): 
     href = link.get("href") 
     title = link.string 
     print(title) 
     print(single_Data(href)) 
     print(href) 
    page += 1 

def single_Data(item_url): 
    source_code = requests.get(item_url) 
    plain_text = source_code.text 
    soup = BeautifulSoup(plain_text, "html.parser") 
    priceog= (soup.find("span", {"id": "priceblock_ourprice"})) 
    price_in = priceog.string 
    return price_in 

spider(1) 

a la fin de l'erreur

AttributeError: 'NoneType' object has no attribute 'string' 

J'ai aussi utilisé pour exécuter le prix de single_Data avec une boucle comme celui-ci

def single_Data(item_url): 
source_code = requests.get(item_url) 
plain_text = source_code.text 
soup = BeautifulSoup(plain_text, "html.parser") 
for item_price in soup.findAll("a", {"class": "a-link-normal"}): 
    price_in= item_price.string 
    return price_in 

Alors, comment puis-je mettre que si elle ne trouve pas

("span", {"id": "priceblock_ourprice"}) 

il ne faut pas donner une erreur ou écrire « Aucun », mais plutôt donner la variable price_in la valeur de chaîne Je veux que: "Il n'y a actuellement aucun prix pour cet article".

Merci xx

Répondre

0

Prenant note de votre message d'erreur, nous pouvons voir que lorsqu'un élément n'a pas de prix, ITEM_PRICE == Aucun. Ainsi donc, vous ajoutez juste une instruction if ci-dessus "price_in = item_price.string" pour vérifier si elle est None, et si oui à la place mettre price_in = "une phrase"

def single_Data(item_url): 
    source_code = requests.get(item_url) 
    plain_text = source_code.text 
    soup = BeautifulSoup(plain_text, "html.parser") 
    for item_price in soup.findAll("a", {"class": "a-link-normal"}): 
     if item_price: 
      price_in = item_price.string 
     else: 
      price_in = "There is currently no price for this item" 
    return price_in 
+0

Merci! Je continuais à écrire « Aucun » ahah, apprécier xx –

0
def single_Data(item_url): 
source_code = requests.get(item_url) 
plain_text = source_code.text 
soup = BeautifulSoup(plain_text, "html.parser") 
for item_price in soup.findAll("a", {"class": "a-link-normal"}): 
    try: 
     price_in = item_price.string 
    except AttributeError: 
     price_in = "price not found" 
return price_in 

L'un des mantras de python c'est qu'il est facile de demander le pardon plutôt que la permission. Essayez d'extraire la chaîne, puis donner la valeur de retour d'une valeur par défaut si vous ne pouvez pas obtenir la chaîne.