Я хочу обработать исключение «индекс списка вне допустимого диапазона».


108

Я использую BeautifulSoup и разбираю некоторые HTML-файлы.

Я получаю определенные данные из каждого HTML (используя цикл for) и добавляю эти данные в определенный список.

Проблема в том, что некоторые HTML-файлы имеют другой формат (и в них нет данных, которые мне нужны) .

Итак, я пытался использовать обработку исключений и добавить значение nullв список (я должен сделать это, поскольку важна последовательность данных).

Например, у меня есть такой код:

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

а некоторые ссылки не имеют их <dd class='title'>, поэтому я хочу nullвместо этого добавить строку в список.

Появляется ошибка:

list index out of range.

Я попытался добавить несколько таких строк:

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

Но не получается. Он все еще показывает ошибку:

list index out of range.

Что мне с этим делать? Стоит ли использовать обработку исключений? или есть способ попроще?

Какие-либо предложения? Любая помощь была бы действительно замечательной!

Ответы:


248

Обработка исключения - это путь:

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

Конечно, вы также можете проверить len()of dlist; но обработка исключения более интуитивна.


1
@JhonIntriagoThoth: Хотя Noneон явно чище, OP хочет 'null'в этом случае.
ThiefMaster

Отличное решение здесь. Я использовал это в своем коде и записал это. Спасибо!
Амир Юнас

32

У вас есть два варианта; либо обработайте исключение, либо проверьте длину:

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

или

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

Используйте первое, если часто нет второго предмета, второе, если иногда нет второго предмета.


24

Достаточно троичного. изменение:

gotdata = dlist[1]

к

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

это более короткий способ выражения

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

3

При обращении к ThiefMaster ♦ иногда мы получаем ошибку со значением, указанным как '\ n' или null, и выполняем действия, необходимые для обработки ValueError:

Обработка исключения - это лучший способ

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
остерегайтесь вкладки, Python 3
Gouled Med

2

Для всех, кому интересен более короткий путь:

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

Но для лучшей производительности я предлагаю использовать Falseвместо 'null', тогда будет достаточно однострочного теста:

gotdata = len(dlist)>1 and dlist[1]
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.