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!

H.Choi
fonte

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.

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

Martijn Pieters
fonte
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'
Ryan Haining
fonte
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'
Pavankumar Barot
fonte
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
fonte
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]
Benamar
fonte