Eu quero lidar com exceção 'índice de lista fora do intervalo.'


107

Estou usando o BeautifulSoup e analisando alguns HTMLs.

Estou obtendo alguns dados de cada HTML (usando o loop for) e adicionando esses dados a uma determinada lista.

O problema é que alguns dos HTMLs têm formato diferente (e eles não têm os dados que desejo neles) .

Portanto, estava tentando usar o tratamento de exceções e agregar valor nullà lista (devo fazer isso, pois a sequência de dados é importante).

Por exemplo, tenho um 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

e alguns dos links não têm nenhum <dd class='title'>, então o que eu quero fazer é adicionar string nullà lista.

O erro aparece:

list index out of range.

O que fiz tentei adicionar algumas linhas como esta:

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

Mas não dá certo. Ainda mostra erro:

list index out of range.

O que devo fazer sobre isso? Devo usar o tratamento de exceções? ou existe alguma maneira mais fácil?

Alguma sugestão? Qualquer ajuda seria muito boa!

Respostas:


246

Lidar com a exceção é o caminho a seguir:

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

Claro, você também pode verificar o len()de dlist; mas lidar com a exceção é mais intuitivo.


1
@JhonIntriagoThoth: Embora Noneseja claramente mais limpo, o OP quer 'null'nesse caso.
ThiefMaster

Ótima solução aqui. Usei-o no meu código e tomei nota disso. Obrigado!
Amir Yunas

31

Você tem duas opções; lidar com a exceção ou testar o comprimento:

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

ou

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

Use o primeiro se geralmente não houver um segundo item, o segundo se às vezes não houver um segundo item.


24

Um ternário será suficiente. mudança:

gotdata = dlist[1]

para

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

esta é uma maneira mais curta de expressar

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

3

Tomando como referência o ThiefMaster ♦ às vezes obtemos um erro com o valor fornecido como '\ n' ou nulo e executamos o necessário para lidar com ValueError:

Lidar com a exceção é o caminho a percorrer

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 com a guia, Python 3
Gouled Med

2

Para qualquer pessoa interessada em uma maneira mais curta:

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

Mas para um melhor desempenho, sugiro usar em Falsevez de 'null', então um teste de uma linha será suficiente:

gotdata = len(dlist)>1 and dlist[1]
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.