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!

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.


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.


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'

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'

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 ')

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]
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.