160 votes

Je veux gérer l'exception "index de la liste hors de la plage".

J'utilise BelleSoupe et l'analyse de certains HTML.

J'obtiens certaines données de chaque HTML. (en utilisant la boucle for) et d'ajouter ces données à une certaine liste.

Le problème est que certains des HTML ont un format différent. (et ils n'ont pas les données que je veux dedans) .

Donc, j'ai essayé d'utiliser la gestion des exceptions et d'ajouter de la valeur. null à la liste (Je devrais le faire puisque la séquence des 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 aucune <dd class='title'> donc ce que je veux faire, c'est ajouter la chaîne de caractères null à la place de la liste.

L'erreur apparaît :

list index out of range.

Ce que j'ai essayé de faire est d'ajouter quelques lignes comme ceci :

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

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

list index out of range.

Que dois-je faire à ce sujet ? Dois-je utiliser le traitement des exceptions ? ou existe-t-il un moyen plus simple ?

Des suggestions ? Toute aide serait la bienvenue !

359voto

ThiefMaster Points 135805

Le traitement de l'exception est la voie à suivre :

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

Bien sûr, vous pouvez aussi vérifier le len() de dlist mais la gestion de l'exception est plus intuitive.

47voto

Martijn Pieters Points 271458

Vous avez deux possibilités : soit traiter 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 deuxième s'il y a parfois il n'y a pas de deuxième élément.

33voto

Ryan Haining Points 5355

Un ternaire suffira. Changement :

gotdata = dlist[1]

à

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

c'est une façon plus courte d'exprimer

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

5voto

Benamar Points 617

Pour ceux qui sont intéressés par un chemin plus court :

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]

3voto

Pavankumar Barot Points 311

En prenant la référence de ThiefMaster♦ parfois nous avons une erreur avec la valeur donnée comme '. \n ' ou null et effectuer ce qui est nécessaire pour gérer ValueError :

Le traitement de l'exception est la solution

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X