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

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; но обработка исключения более интуитивна.

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

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

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

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

gotdata = len(dlist)>1 and dlist[1]
Бенамар
источник