Chcę, aby uchwyt wyjątków „indeks listy poza zakresem”.

107

Używam BeautifulSoup i parsuję niektóre HTML.

Otrzymuję określone dane z każdego kodu HTML (używając pętli for) i dodaję te dane do określonej listy.

Problem polega na tym, że niektóre HTML mają inny format (i nie mają w nich danych, których potrzebuję) .

Więc próbowałem użyć obsługi wyjątków i dodać wartość nulldo listy (powinienem to zrobić, ponieważ kolejność danych jest ważna).

Na przykład mam kod taki jak:

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

a niektóre linki nie mają żadnych <dd class='title'>, więc nullzamiast tego chcę dodać ciąg do listy.

Pojawia się błąd:

list index out of range.

Próbowałem dodać kilka linii w ten sposób:

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

Ale to nie działa. Nadal pokazuje błąd:

list index out of range.

Co mam z tym zrobić? Czy powinienem używać obsługi wyjątków? czy jest jakiś łatwiejszy sposób?

Jakieś sugestie? Każda pomoc byłaby naprawdę świetna!

H.Choi
źródło

Odpowiedzi:

247

Obsługa wyjątku to najlepszy sposób:

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

Oczywiście możesz też sprawdzić len()of dlist; ale obsługa wyjątku jest bardziej intuicyjna.

ThiefMaster
źródło
1
@JhonIntriagoThoth: Chociaż Nonejest wyraźnie czystszy, OP chce 'null'w tym przypadku.
ThiefMaster
Świetne rozwiązanie. Użyłem go w swoim kodzie i zanotowałem to. Dzięki!
Amir Yunas
32

Masz dwie możliwości; obsłuż wyjątek lub sprawdź długość:

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

lub

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

Użyj pierwszego, jeśli często nie ma drugiego elementu, drugiego, jeśli czasami nie ma drugiego elementu.

Martijn Pieters
źródło
24

Wystarczy trójskładnik. zmiana:

gotdata = dlist[1]

do

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

to jest krótszy sposób wyrażania

if len(dlist) > 1:
    gotdata = dlist[1]
else: 
    gotdata = 'null'
Ryan Haining
źródło
3

Biorąc odniesienie do ThiefMaster ♦ czasami otrzymujemy błąd o wartości podanej jako '\ n' lub null i wykonujemy dla tego, co jest wymagane do obsługi ValueError:

Obsługa wyjątku jest drogą do zrobienia

try:
    gotdata = dlist[1]
except (IndexError, ValueError):
    gotdata = 'null'
Pavankumar Barot
źródło
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
źródło
2
uważaj na kartę, Python 3
Gouled Med,
2

Dla wszystkich zainteresowanych krótszą drogą:

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

Ale aby uzyskać najlepszą wydajność, sugeruję użycie Falsezamiast 'null', wtedy wystarczy jeden test liniowy:

gotdata = len(dlist)>1 and dlist[1]
Benamar
źródło