Я хочу виключити обробку "індекс списку поза діапазоном".


107

Я використовую BeautifulSoup та розбираю деякі HTML.

Я отримую певні дані з кожного HTML (використовую для циклу) і додаю ці дані до певного списку.

Проблема полягає в тому, що деякі 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.

Що мені робити з цього приводу? Чи варто використовувати обробку виключень? чи є простіший спосіб?

Будь-які пропозиції? Будь-яка допомога була б справді чудовою!

Відповіді:


246

Поводження з винятком - це шлях:

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

Звичайно , ви можете також перевірити len()з dlist; але поводження з винятком більш інтуїтивно зрозуміле.


1
@JhonIntriagoThoth: Хоча в цій справі Noneявно чистіше, ОП хоче 'null'.
ThiefMaster

Чудове рішення тут. Я використав його у своєму коді і зробив це. Дякую!
Амір Юнас

31

У вас є два варіанти; або обробити виняток, або перевірити довжину:

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.