2012-08-10 11 views
54

Estoy usando BeautifulSoup y analizo algunos HTML.Quiero hacer una excepción del 'índice de la lista fuera de rango'.

Obtengo cierta información de cada HTML (usando for loop) y agrego esa información a una cierta lista.

El problema es que algunos de los HTML tienen un formato diferente (y no tienen los datos que quiero en ellos).

lo tanto, yo estaba tratando de usar el control de excepciones y agregar valor null a la lista (. Debería hacer esto ya que la secuencia de datos es importante)

Por ejemplo, tengo un código como:

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 

y algunos de los enlaces no tienen ningún <dd class='title'>, así que lo que quiero hacer es agregar una cadena null a la lista en su lugar.

El error aparece:

list index out of range. 

lo que he hecho probado es añadir algunas líneas de la siguiente manera:

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

Pero no funciona. Todavía muestra el error:

list index out of range. 

¿Qué debo hacer al respecto? ¿Debería usar el manejo de excepciones? o hay alguna manera más fácil?

¿Alguna sugerencia? ¡Cualquier ayuda sería realmente genial!

Respuesta

132

Manejo de la excepción es el camino a seguir:

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

Por supuesto, también puede comprobar el len() de dlist; pero manejar la excepción es más intuitivo.

+0

@JhonIntriagoThoth: Mientras que 'None' es claramente más limpio, el OP quiere' 'nulo'' en este caso. – ThiefMaster

24

Tiene dos opciones; o bien controlar la excepción o probar la longitud:

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

o

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

utilizar la primera si no menudo hay un segundo elemento, el segundo si hay veces hay un segundo elemento.

+0

¡gracias! esto funciona :) –

14

Un ternario será suficiente.cambio:

gotdata = dlist[1] 

a

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

se trata de una mano corta para

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

ternario era lo que no sabía! buen consejo. gracias :) –

3

Tomando referencia de ThiefMaster ♦ veces obtenemos un error con el valor dado como '\ n' o nula y realizar para que requiera manejar ValueError:

Manejando la excepción es el camino a seguir

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

cuidado con la pestaña, Python 3 –

1

para cualquiera interesado en un camino más corto:

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

Sin embargo, para un mejor rendimiento, se sugiere emplear falso en lugar de 'nulo', entonces será suficiente una prueba de una línea:

gotdata = len(dlist)>1 and dlist[1] 
Cuestiones relacionadas