web-dev-qa-db-ja.com

「リストインデックスが範囲外です」という例外処理を行いたい。

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.

これについてどうすればよいですか?例外処理を使用する必要がありますか?または簡単な方法はありますか?

助言がありますか?どんな助けも本当に素晴らしいでしょう!

82
H.Choi

例外を処理する方法です。

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

もちろん、dlistlen()も確認できます。ただし、例外の処理はより直感的です。

203
ThiefMaster

2つのオプションがあります。例外を処理するか、長さをテストします。

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

または

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

しばしばが2番目の項目がない場合は最初を使用し、sometimesが2番目の項目がない場合は2番目を使用します。

28
Martijn Pieters

三元で十分です。変化する:

gotdata = dlist[1]

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

これは表現のより短い方法です

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

ThiefMaster♦を参照すると、値が '\ n'またはnullとして指定されたエラーが発生することがあり、ValueErrorの処理に必要なエラーを実行します。

例外を処理する方法です

try:
    gotdata = dlist[1]
except (IndexError, ValueError):
    gotdata = 'null'
3

短い方法に興味がある人には:

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

ただし、最高のパフォーマンスを得るには、「null」の代わりにFalseを使用することをお勧めします。1行のテストで十分です。

gotdata = len(dlist)>1 and dlist[1]
1
Benamar
for i in range (1, len(list))
    try:
        print (list[i])

    except ValueError:
        print("Error Value.")
    except indexError:
        print("Erorr index")
    except :
        print('error ')
1
Gouled Med