예외 처리 '목록 색인이 범위를 벗어남'을 원합니다.


107

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.

이것에 대해 어떻게해야합니까? 예외 처리를 사용해야합니까? 아니면 더 쉬운 방법이 있습니까?

어떤 제안? 어떤 도움이라도 정말 좋을 것입니다!

답변:


246

예외를 처리하는 것이 방법입니다.

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

물론 당신은 또한 확인할 수 len()의를 dlist; 그러나 예외를 처리하는 것이 더 직관적입니다.


1
@JhonIntriagoThoth : None명확하게 깨끗 하지만 OP는 'null'이 경우에 원합니다 .
ThiefMaster

여기에 훌륭한 솔루션입니다. 내 코드에서 사용하고 메모했습니다. 감사!
Amir Yunas

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
탭 조심, 파이썬 3
Gouled 메드

2

더 짧은 방법에 관심이있는 사람 :

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

그러나 최상의 성능을 위해 False대신을 사용 하는 것이 좋습니다 'null'. 그러면 한 줄 테스트로 충분합니다.

gotdata = len(dlist)>1 and dlist[1]
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.