Je souhaite gérer l'exception "index de liste hors limites".

107

J'utilise BeautifulSoup et j'analyse certains HTML.

J'obtiens certaines données de chaque HTML (en utilisant la boucle for) 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) .

Donc, j'essayais 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 des liens n'en ont pas <dd class='title'>, donc ce que je veux faire est d'ajouter une chaîne nullà la liste à la place.

L'erreur apparaît:

list index out of range.

Ce que j'ai fait, 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? Dois-je utiliser la gestion des exceptions? ou y a-t-il un moyen plus simple?

Aucune suggestion? Toute aide serait vraiment géniale!

H.Choi
la source

Réponses:

246

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

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

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

ThiefMaster
la source
1
@JhonIntriagoThoth: Alors que Nonec'est clairement plus propre, l'OP veut 'null'dans ce cas.
ThiefMaster
Excellente solution ici. Je l'ai utilisé dans mon code et en ai pris note. Merci!
Amir Yunas le
32

Vous avez deux options; gérer l'exception ou 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 n'y a souvent pas de deuxième élément, le second s'il n'y a parfois pas de deuxième élément.

Martijn Pieters
la source
24

Un ternaire suffira. changement:

gotdata = dlist[1]

à

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

c'est une manière plus courte d'exprimer

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

Prenant référence à ThiefMaster ♦ parfois nous obtenons une erreur avec une valeur donnée comme '\ n' ou null et exécutons pour ce qui est nécessaire pour gérer ValueError:

Gérer l'exception est la voie à suivre

try:
    gotdata = dlist[1]
except (IndexError, ValueError):
    gotdata = 'null'
Pavankumar Barot
la source
2
for i in range (1, len(list))
    try:
        print (list[i])

    except ValueError:
        print("Error Value.")
    except indexError:
        print("Erorr index")
    except :
        print('error ')
Gouled Med
la source
2
méfiez-vous de l'onglet, Python 3
Gouled Med
2

Pour toute personne intéressée par un moyen plus court:

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

Mais pour de meilleures performances, je suggère d'utiliser à la Falseplace de 'null', puis un test d'une ligne suffira:

gotdata = len(dlist)>1 and dlist[1]
Benamar
la source