Voglio gestire l'eccezione "indice elenco fuori intervallo".


107

Sto usando BeautifulSoup e sto analizzando alcuni HTML.

Sto ottenendo determinati dati da ogni HTML (usando il ciclo for) e aggiungo quei dati a un certo elenco.

Il problema è che alcuni HTML hanno un formato diverso (e non hanno i dati che voglio in essi) .

Quindi, stavo cercando di utilizzare la gestione delle eccezioni e aggiungere valore nullall'elenco (dovrei farlo poiché la sequenza di dati è importante.)

Ad esempio, ho un codice come:

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

e alcuni collegamenti non ne hanno <dd class='title'>, quindi quello che voglio fare è aggiungere una stringa nullall'elenco.

Viene visualizzato l'errore:

list index out of range.

Quello che ho fatto ho provato è aggiungere alcune righe come questa:

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

Ma non funziona. Mostra ancora l'errore:

list index out of range.

Cosa dovrei fare a riguardo? Devo usare la gestione delle eccezioni? o c'è un modo più semplice?

Eventuali suggerimenti? Qualsiasi aiuto sarebbe davvero fantastico!

Risposte:


246

Gestire l'eccezione è la strada da percorrere:

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

Ovviamente potresti anche controllare il len()di dlist; ma gestire l'eccezione è più intuitivo.


1
@JhonIntriagoThoth: Anche se Noneè chiaramente più pulito, l'OP vuole 'null'in questo caso.
ThiefMaster

Ottima soluzione qui. L'ho usato nel mio codice e ne ho preso nota. Grazie!
Amir Yunas,

32

Hai due opzioni; gestire l'eccezione o testare la lunghezza:

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

o

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

Usa il primo se spesso non c'è un secondo elemento, il secondo se a volte non c'è un secondo elemento.


24

Basterà un ternario. modificare:

gotdata = dlist[1]

per

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

questo è un modo più breve di esprimere

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

3

Facendo riferimento a ThiefMaster ♦ a volte otteniamo un errore con il valore dato come '\ n' o null ed eseguiamo per quello richiesto per gestire ValueError:

Gestire l'eccezione è la strada da percorrere

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
attenzione alla scheda, Python 3
Gouled Med

2

Per chiunque sia interessato a un modo più breve:

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

Ma per ottenere le migliori prestazioni, suggerisco di utilizzare Falseinvece di 'null', quindi sarà sufficiente un test di una riga:

gotdata = len(dlist)>1 and dlist[1]
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.