'List dizini aralık dışında' istisna işlemek istiyorum.


108

BeautifulSoup kullanıyorum ve bazı HTML'leri ayrıştırıyorum.

Her HTML'den belirli bir veri alıyorum (for döngüsünü kullanarak) ve bu verileri belirli bir listeye ekliyorum.

Sorun şu ki, bazı HTML'lerin farklı biçimleri var (ve benim istediğim verilere sahip değiller) .

Bu yüzden, istisna işlemeyi kullanmaya ve nulllisteye değer katmaya çalışıyordum (veri dizisi önemli olduğu için bunu yapmalıyım.)

Örneğin, şöyle bir kodum var:

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

ve bazı bağlantılarda hiç yok <dd class='title'>, bu yüzden yapmak istediğim şey nulllisteye dize eklemek .

Hata belirir:

list index out of range.

Yaptığım şey şuna benzer bazı satırlar eklemektir:

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

Ama yürümüyor. Hala hata gösteriyor:

list index out of range.

Bununla ilgili ne yapmalıyım? İstisna işlemeyi kullanmalı mıyım? veya daha kolay bir yolu var mı?

Baska öneri? Herhangi bir yardım gerçekten harika olurdu!

Yanıtlar:


248

İstisnayı ele almak, gitmenin yoludur:

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

Tabii ki aynı zamanda kontrol edebilir len()ve dlist; ancak istisnayı ele almak daha sezgiseldir.


1
@JhonIntriagoThoth: NoneAçıkça daha temiz olsa da, OP 'null'bu durumda istiyor .
ThiefMaster

Burada harika çözüm. Kodumda kullandım ve not aldım. Teşekkürler!
Amir Yunas

32

İki seçeneğiniz var; ya istisnayı ele alın ya da uzunluğu test edin:

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

veya

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

Genellikle ikinci öğe yoksa birincisini , bazen ikinci öğe yoksa ikinciyi kullanın.


24

Bir üçlü yeterli olacaktır. değişiklik:

gotdata = dlist[1]

-e

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

bu ifade etmenin daha kısa bir yolu

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

3

ThiefMaster ♦ referans alınarak, bazen '\ n' veya null olarak verilen değerde bir hata alıyoruz ve ValueError'ı işlemek için gerekli olanı gerçekleştiriyoruz:

İstisnayı ele almak, gitmenin yoludur

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
sekmeye dikkat edin, Python 3
Gouled Med

2

Daha kısa yoldan ilgilenen herkes için:

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

Ancak en iyi performans için Falsebunun yerine kullanmanızı öneririm 'null', o zaman tek satırlık bir test yeterli olacaktır:

gotdata = len(dlist)>1 and dlist[1]
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.