2012-08-10 7 views
54

Sto usando BeautifulSoup e analizzo alcuni HTML.Voglio gestire l'indice dell'elenco di eccezioni fuori intervallo. '

Ricevo determinati dati da ciascun codice HTML (utilizzando il ciclo) e aggiungo tali dati a un determinato elenco.

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

Così, stavo cercando di usare la gestione delle eccezioni e aggiungere valore null alla lista (. Devo fare questo in quanto la sequenza di dati è importante)

Per 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 dei collegamenti non hanno alcun <dd class='title'>, quindi quello che voglio fare è aggiungere stringa null alla lista, invece.

appare l'errore:

list index out of range. 

quello che ho fatto provato è quello di aggiungere alcune righe come questo:

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

Ma non funziona. Si mostra ancora errore:

list index out of range. 

Cosa devo fare? Dovrei usare la gestione delle eccezioni? o c'è un modo più semplice?

Qualche suggerimento? Qualsiasi aiuto sarebbe davvero fantastico!

risposta

132

Gestione della eccezione è la strada da percorrere:

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

Naturalmente si potrebbe anche verificare l'len() di dlist; ma gestire l'eccezione è più intuitivo.

+0

@JhonIntriagoThoth: Mentre 'None' è chiaramente più pulito, in questo caso l'OP vuole" null ". – ThiefMaster

24

Hai due opzioni; sia 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 

utilizzare il primo caso spesso c'è secondo elemento, il secondo caso talvolta c'è secondo elemento.

+0

grazie! questo funziona :) –

14

Un ternario è sufficiente.cambiamento:

gotdata = dlist[1] 

a

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

questa è una mano breve per

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

ternario era quello che non sapevo! bel consiglio. grazie :) –

3

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

Gestione dell'eccezione è la strada da percorrere

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

    except ValueError: 
     print("Error Value.") 
    except indexError: 
     print("Erorr index") 
    except : 
     print('error ') 
+0

attenti alla scheda, Python 3 –

1

per nessuno interessato a una via più breve:

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

Ma per le migliori prestazioni, io suggerisco di usare False invece di 'nulla', poi un test di una riga sarà sufficiente:

gotdata = len(dlist)>1 and dlist[1] 
Problemi correlati