web-dev-qa-db-fra.com

Je veux gérer une exception "index de liste hors de portée".

J'utilise BeautifulSoup et j'analyse certains HTML.

J'obtiens une certaine donnée de chaque HTML (en utilisant for boucle) et j'ajoute ces données à une certaine liste.

Le problème est que certains HTML ont un format différent (et ils ne contiennent pas les données que je veux en avoir) .

J'essayais donc d'utiliser la gestion des exceptions et d'ajouter de la valeur null à la liste (je devrais le faire car la séquence de données est importante.)

Par exemple, j'ai un code comme:

soup = BeautifulSoup(links)
dlist = soup.findAll('dd', 'title')
# I'm trying to find content between <dd class='title'> and </dd>
gotdata = dlist[1]
# and what i want is the 2nd content of those
newlist.append(gotdata)
# and I add that to a newlist

et certains liens n'ont pas de <dd class='title'>, alors je veux plutôt ajouter la chaîne null à la liste.

L'erreur apparaît:

list index out of range.

Ce que j'ai essayé, c'est d'ajouter quelques lignes comme ceci:

if not dlist[1]:  
   newlist.append('null')
   continue

Mais ça ne marche pas. Il montre toujours une erreur:

list index out of range.

Que dois-je faire à ce sujet? Devrais-je utiliser la gestion des exceptions? ou y a-t-il un moyen plus facile?

Aucune suggestion? Toute aide serait vraiment géniale!

85
H.Choi

La gestion de l'exception est la voie à suivre:

try:
    gotdata = dlist[1]
except IndexError:
    gotdata = 'null'

Bien sûr, vous pouvez aussi vérifier la len() de dlist; mais gérer l'exception est plus intuitif.

205
ThiefMaster

Vous avez deux options. soit gérer l'exception, soit tester la longueur:

if len(dlist) > 1:
    newlist.append(dlist[1])
    continue

ou

try:
    newlist.append(dlist[1])
except IndexError:
    pass
continue

Utilisez le premier s'il y a souvent n'est pas un deuxième élément, le second s'il y a parfois n'est pas un deuxième élément.

28
Martijn Pieters

Un ternaire suffira. changement:

gotdata = dlist[1]

à

gotdata = dlist[1] if len(dlist) > 1 else 'null'

c'est un moyen plus court d'exprimer

if len(dlist) > 1:
    gotdata = dlist[1]
else: 
    gotdata = 'null'
17
Ryan Haining

En prenant la référence de ThiefMaster ♦ nous obtenons parfois une erreur avec la valeur donnée comme '\ n' ou null et que nous effectuons la tâche requise pour gérer ValueError:

La gestion de l'exception est la voie à suivre

try:
    gotdata = dlist[1]
except (IndexError, ValueError):
    gotdata = 'null'
3
Pavankumar Barot

pour toute personne intéressée de manière plus courte:

gotdata = len(dlist)>1 and dlist[1] or 'null'

Mais pour de meilleures performances, je suggère d'utiliser False au lieu de 'null', alors un test d'une ligne suffira:

gotdata = len(dlist)>1 and dlist[1]
1
Benamar
for i in range (1, len(list))
    try:
        print (list[i])

    except ValueError:
        print("Error Value.")
    except indexError:
        print("Erorr index")
    except :
        print('error ')
1
Gouled Med