1
votes

BeautifulSoup ne peut pas utiliser if vaut None, puis continuez l'instruction pour éviter que l'objet 'NoneType' ne soit en indice Erreur de type

Le code est le suivant:

import requests
from bs4 import BeautifulSoup
ticker='FAST'
url = "https://www.google.com/search?q=nasdaq+%s+earnings+reaction+history&tbs=qdr:m"%(ticker)
response = requests.get(url)
soup = BeautifulSoup(response.text, "html.parser")
# for searchs in soup.find_all('div', {'class':'BNeawe s3v9rd AP7Wnd'}):
cache = []
for searchs in soup.find_all('div', {'class':'kCrYT'}):
    if searchs.find('a')['href'] is None: continue
    cache.append(searchs.find('a')['href'])
    print(''.join(cache))

Je souhaite utiliser l'instruction if continue pour éviter l'erreur de type lorsque .find ('a') ['href'] ne renvoie aucun résultat. Cependant, cela ne fait pas le travail. Quelqu'un pourrait-il indiquer un moyen de le surmonter?


3 Réponses :


1
votes

Utilisez le code ci-dessous pour sortir de TypeError.

try:
    cache.append(searchs.find('a')['href'])
except TypeError:
    continue


1 commentaires

Merci d'avoir répondu! Je sais utiliser try + sauf pour gérer l'erreur. Ce que je souhaite comprendre, c'est le problème associé à l'instruction if continue.



1
votes

N'essayez pas de mettre autant de choses sur une seule ligne:

...
for searchs in soup.find_all('div'):
    tag = searchs.find('a')
    #print(searchs)
    if not tag:
        continue
    try:
        h = tag['href']
    except KeyError as e:
        continue
    print(h)


1 commentaires

Oui, le problème réside exactement dans le cas searchs.find ('a') is None pour lequel la référence à son champ 'href' produit l'erreur de type!



1
votes

En fonction de ce que vous vouliez faire d'autre avec block si ce n'est qu'après href puis utilisez select et spécifiez que la classe parente avec l'élément enfant avec href code > attribut utilisant le combinateur descendant

import requests
from bs4 import BeautifulSoup

ticker='FAST'
url = "https://www.google.com/search?q=nasdaq+%s+earnings+reaction+history&tbs=qdr:m"%(ticker)
response = requests.get(url)
soup = BeautifulSoup(response.text, "html.parser")
cache = [searchs['href'] for searchs in soup.select('div.kCrYT [href]')]
print(''.join(cache))


1 commentaires

solution vraiment sympa! Je veux collecter le résultat de la recherche et visiter les URL valides, le soup.select () évite si ... continuez et essayez ... sauf déclaration tout à fait, vraiment sympa et merci beaucoup!