작성
·
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인데 리스트가 될 수 있는지요?
감사합니다
--------------------------------------------------------------------------------------------
원 질문
안녕하세요!
제가 보기에도 좀 이상하네요.
혹시 type(ul_element), print(ul_element) 두 명령어 결과 첨부 가능하실까요?
답변 1
1
안녕하세요.
우선 한가지 먼저 말씀드리면, 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 참고)
라이브러리 코드를 뜯어보고 관찰하시는것이 처음이면 좀 어려우실수도 있는데, 제 답변을 통해 '코드 분석은 이런 방식과 흐름으로 진행하는구나'라는 느낌만 우선 가져가시고, 차근차근 연습하시면, 이후에 비슷한 문제에 부딪혔을 때 큰 도움이 되시리라 생각합니다.
좋은질문 감사드립니다.
교수님
답변 감사드립니다. 말씀대로 천천히 더 공부해보도록 하겠습니다!