Saya ingin pengecualian menangani 'daftar indeks di luar jangkauan.'

107

Saya menggunakan BeautifulSoup dan mengurai beberapa HTML.

Saya mendapatkan data tertentu dari setiap HTML (menggunakan for loop) dan menambahkan data itu ke daftar tertentu.

Masalahnya adalah, beberapa HTML memiliki format yang berbeda (dan mereka tidak memiliki data yang saya inginkan di dalamnya) .

Jadi, saya mencoba menggunakan penanganan pengecualian dan menambahkan nilai nullke daftar (saya harus melakukan ini karena urutan data itu penting.)

Misalnya, saya punya kode seperti:

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

dan beberapa tautan tidak memilikinya <dd class='title'>, jadi yang ingin saya lakukan adalah menambahkan string nullke daftar.

Kesalahan muncul:

list index out of range.

Apa yang telah saya coba lakukan adalah menambahkan beberapa baris seperti ini:

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

Tapi itu tidak berhasil. Itu masih menunjukkan kesalahan:

list index out of range.

Apa yang harus saya lakukan tentang ini? Haruskah saya menggunakan penanganan pengecualian? atau apakah ada cara yang lebih mudah?

Ada saran? Bantuan apa pun akan sangat bagus!

H. Choi
sumber

Jawaban:

246

Menangani pengecualian adalah caranya:

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

Tentu saja Anda juga dapat memeriksa len()dari dlist; tetapi menangani pengecualian lebih intuitif.

ThiefMaster
sumber
1
@JhonIntriagoThoth: Meskipun Nonejelas lebih bersih, OP menginginkan 'null'kasus ini.
ThiefMaster
Solusi hebat di sini. Saya menggunakannya dalam kode saya dan mencatatnya. Terima kasih!
Amir Yunas
31

Anda memiliki dua pilihan; menangani pengecualian atau menguji panjangnya:

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

atau

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

Gunakan yang pertama jika sering tidak ada item kedua, yang kedua jika terkadang tidak ada item kedua.

Martijn Pieters
sumber
24

Terner sudah cukup. perubahan:

gotdata = dlist[1]

untuk

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

ini adalah cara yang lebih singkat untuk mengungkapkannya

if len(dlist) > 1:
    gotdata = dlist[1]
else: 
    gotdata = 'null'
Ryan Haining
sumber
3

Mengambil referensi ThiefMaster ♦ terkadang kita mendapatkan kesalahan dengan nilai yang diberikan sebagai '\ n' atau null dan melakukan itu yang diperlukan untuk menangani ValueError:

Menangani pengecualian adalah cara yang harus dilakukan

try:
    gotdata = dlist[1]
except (IndexError, ValueError):
    gotdata = 'null'
Pavankumar Barot
sumber
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
sumber
2
waspadalah terhadap tab, Python 3
Gouled Med
2

Bagi siapa pun yang tertarik dengan cara yang lebih singkat:

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

Tetapi untuk kinerja terbaik, saya sarankan menggunakan Falsealih-alih 'null', maka uji satu baris sudah cukup:

gotdata = len(dlist)>1 and dlist[1]
Benamar
sumber