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!

H.Choi
fuente

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.

ThiefMaster
fuente
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.

Martijn Pieters
fuente
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'
Ryan Haining
fuente
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'
Pavankumar Barot
fuente
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 ')
Gouled Med
fuente
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]
Benamar
fuente