Quiero manejar la excepción 'índice de lista fuera de rango'.


107

Estoy usando BeautifulSoup y analizando algunos HTML.

Obtengo ciertos datos de cada HTML (usando el bucle for) y agrego esos datos a una lista determinada.

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

Entonces, estaba tratando de usar el manejo de excepciones y agregar valor nulla 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 ninguno <dd class='title'>, así que lo que quiero hacer es agregar una cadena nulla la lista.

Aparece el error:

list index out of range.

Lo que he intentado es agregar algunas líneas como esta:

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

Pero no funciona. Todavía muestra error:

list index out of range.

¿Qué debo hacer al respecto? ¿Debería utilizar el manejo de excepciones? ¿O hay alguna forma más fácil?

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

Respuestas:


246

Manejar 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.


1
@JhonIntriagoThoth: Si bien Noneestá claramente más limpio, el OP quiere 'null'en este caso.
ThiefMaster

Gran solución aquí. Lo usé en mi código y lo anoté. ¡Gracias!
Amir Yunas

31

Tienes dos opciones; manejar 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

Utilice el primero si a menudo no hay un segundo elemento, el segundo si a veces no hay un segundo elemento.


24

Un ternario será suficiente. cambio:

gotdata = dlist[1]

a

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

esta es una forma más corta de expresar

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

3

Tomando referencia a ThiefMaster ♦ a veces obtenemos un error con un valor dado como '\ n' o nulo y realizamos el requerido para manejar ValueError:

Manejar la excepción es el camino a seguir

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
cuidado con la pestaña, Python 3
Gouled Med

2

Para cualquiera interesado en una forma más corta:

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

Pero para un mejor rendimiento, sugiero usar en Falselugar de 'null', entonces una prueba de una línea será suficiente:

gotdata = len(dlist)>1 and dlist[1]
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.