인프런 커뮤니티 질문&답변

ilhalm님의 프로필 이미지
ilhalm

작성한 질문수

내 업무를 대신 할 파이썬(Python) 웹크롤링 & 자동화 (feat. 주식, 부동산 데이터 / 인스타그램)

len(ul_element) 관련 질문_추가

작성

·

196

0

 

교수님

 

안녕하십니까? 아래 질문에 대해 말씀주신 부분을 다음과 같이 첨부드립니다. 

 

type(ul_element)

bs4.element .Tag

 

print(ul_element)


<ul class="kwd_lst _recent"> <li class="item _item" data-keyword="@in_txt@" data-rank="@rank@" data-template-type="history"> <a class="kwd" href="#"> <span class="fix"><span class="common_ico_kwd"><i class="imsc ico_search"></i></span><span>@txt@</span></span> </a> <span class="etc"> <em class="date">@date@.</em> <a aria-pressed="false" class="bt_item _del" href="#" role="button"><i class="imsc ico_del">삭제</i></a> </span> </li> </ul>



지금 다시 보니까 ul_element도 ul_elements 내의 또 다른 리스트가 아니었나 싶습니다. 즉 13개의 원소로 이루어진 ul_elements의 첫 번째 요소인 ul_element도 3개의 요소로 구성 된 리스트 형태인 건 아닌지요? 그런데 type가 Tag인데 리스트가 될 수 있는지요?

 

감사합니다

 

--------------------------------------------------------------------------------------------

원 질문

 

 

교수님
 
안녕하세요? 강의 너무 잘 듣고 있는 학생입니다. 문의 사항이 한 가지 있습니다.
 
select() 강의에서

------------------------------------------------------------------------------

ul_elements = soup.select("ul")

len(ul_elements)
13
 
-> 13개 원소 중에서 아래 ul_element는 첫 번째 원소만 뽑아냈는데, 왜 len(ul_element)는 1이 아닌 3이 나오는지요? 원소가 1개이기 때문에 1이 되야 하는 것은 아닌지요?
 
ul_element = ul_elements[0]
 
len(ul_element)
3

-------------------------------------------------------------------------------------
 
교수님 답변
 

 

안녕하세요!

제가 보기에도 좀 이상하네요.

혹시 type(ul_element), print(ul_element) 두 명령어 결과 첨부 가능하실까요?

 

 

답변 1

1

DeepingSauce님의 프로필 이미지
DeepingSauce
지식공유자

안녕하세요.

 

우선 한가지 먼저 말씀드리면, len()는 list type의 객체에만 호출이 되는 함수는 아닙니다.

가령 string 클래스 객체에도 쓸수가 있죠.

왜냐하면 len()함수는 내부적으로 해당 객체의 __len__ 함수를 호출하게 설계되어있습니다.

따라서 어떤 클래스이든 __len__() 함수를 구현했다면, 해당 함수가 반환하는 값을 출력하도록 되어있습니다.

 

bs4의 github에서 Tag 클래스를 자세히들여다보시면, 마찬가지로 __len__()이 구현되어있음을 확인하실 수 있습니다: https://github.com/newvem/beautifulsoup/blob/03b1b76ff969651b1ec4071c0b2e749590461f7d/bs4/element.py#L574

 

여기서 len(self.contents)를 return하는데 여기서 self.contents는 Tag라는 클래스가 상속받은 PageElement라는 부모클래스에서 정의되는 녀석입니다(리스트 타입).

 

이 self.contents는 Tag라는 object내에서 해당 element의 자식 element를 넣어두는 리스트라고 보시면 되겠습니다 (https://github.com/newvem/beautifulsoup/blob/03b1b76ff969651b1ec4071c0b2e749590461f7d/bs4/element.py#L106 참고)

 

라이브러리 코드를 뜯어보고 관찰하시는것이 처음이면 좀 어려우실수도 있는데, 제 답변을 통해 '코드 분석은 이런 방식과 흐름으로 진행하는구나'라는 느낌만 우선 가져가시고, 차근차근 연습하시면, 이후에 비슷한 문제에 부딪혔을 때 큰 도움이 되시리라 생각합니다.

 

좋은질문 감사드립니다.

ilhalm님의 프로필 이미지
ilhalm
질문자

교수님

 

답변 감사드립니다. 말씀대로 천천히 더 공부해보도록 하겠습니다!

ilhalm님의 프로필 이미지
ilhalm

작성한 질문수

질문하기