Python notes/Python Errors

파이썬 크롤러) AttributeError: 'NoneType' object has no attribute 'find_all'

성실한 나무 2018. 12. 12. 17:28

#1. AttributeError는 무슨 에러인가?

 웹페이지에 있는 테이블의 컨텐츠를 긁어오기 위한 크롤러를 만들고, 그 코드를 실행시키고, table 객체에 값을 열심히 쌓아놓고, 해당 table에서 특정 단어를 가지는 데이터를 find_all로 검색하려던 참이었다. 이제 뭔가 크롤링된 값이 뜰 때가 됐는데 웬걸, 갑자기 에러가 발생했다. 에러의 이름은 AttributeError였다. 일단 이게 무슨 뜻인지 잘 와닿지가 않아서 사전을 찾아보았다. 사전에서 여러가지 Attribute 명사형의 뜻들을 살펴보니 게 중에 제일 연관성 있어 보이는 뜻은 속성, 딸린 물건이라는 뜻이었다. 속성값에 문제가 있는 것일까?

 

 파이썬 코딩 중에 에러가 나면 가장 마지막 줄을 보면 된다고 했기에, 에러 코드를 좀 더 상세히 들여다 보았다. 속성에러가 발생했고, NoneType, 즉 없는 타입의 객체는 'find_all'이라는 부수물을 가지지 않는다라고 대충 직역해 보았다. 생각해보니, 내가 만든 객체에 find_all이라는 함수를 붙여 쓸 수 없다는 뜻으로 해석이 되었다.

AttributeError

 

 

#2. 그럼 해결방법은 어떻게 될까?

 

반응형

 

AttributeError: 'NoneType' object has no attribute 'find_all'

이리저리 검색해 보고 파이썬으로 실험을 해서 알고보니, 위에 해석한 말 그대로였다. "검색 되어지는 값이 하나도 없을 때" 나오는 에러였다. table 안에 분명 파싱한 많은 데이터들이 들어 있을텐데 이게 무슨 소리일까 에러에 대한 의구심을 가지고 table을 print함수로 출력해보았다.

None

 

허거덩이다. 결과는 None, table에는 아무 값도 할당된 게 없었다. table 안에 '딸린 물건'이 아무 것도 없었던 것이다. 텅 빈 table 객체에서 find_all이라는 함수를 사용했기 때문에 AttributeError가 에러가 난 것이었다. 왜 파싱이 하나도 안 됐는지 (아픈 눈과 가슴을 부여잡고) 다시 면밀히 코드를 살펴 보고, table을 재정의하기 시작했다. 이번엔 파싱이 성공적으로 된 것을 확인했다. 결과는 어땠을까?

과연, table에 값이 가득 찬 상태에서 find_all 함수를 쓰니, 결과 조회 하는데 문제없이 동작하였다.