(1) 문제 상황
셀레니움을 활용하여 스타벅스 사이트에 나와있는 점포 정보를 가져오는 프로젝트를 진행 중에
코드리뷰를 하면서 get_attribute() 안에 들어올 수 있는 인자들이 다양하게 있다는 것을 알게되어서
인자별 차이점을 기록하기 위해 글을 작성합니다.
# 주소
address_p = store.find_element(By.CSS_SELECTOR, 'p.result_details')
address = address_p.get_attribute('textContent').strip().split('1522-3232')[0].strip()
위 코드에 'textContent'가 있는 부분에 들어갈 수 있는 값을 주목하면서 보시면 될 것 같습니다.
(2) innerHTML, innerText, textContent 각각의 특징
먼저 세 가지 인자가 어떤 값을 반환하는지 살펴보겠습니다.
아래와 같은 HTML이 있다고 가정해봅니다.
<p class="result_details">
서울특별시 강남구 테헤란로 <span style="display:none">숨겨진텍스트</span> 427
1522-3232
</p>
(2-1) innerHTML을 사용하면 태그 안의 HTML 마크업을 그대로 가져옵니다.
address_p.get_attribute('innerHTML')
# 결과: '\n 서울특별시 강남구 테헤란로 <span style="display:none">숨겨진텍스트</span> 427\n 1522-3232\n'
즉, <span> 같은 태그가 문자열에 포함되어 나옵니다.
(2-2) innerText를 사용하면 실제 화면에 렌더링된 텍스트만 가져옵니다.
address_p.get_attribute('innerText')
# 결과: '서울특별시 강남구 테헤란로 427\n1522-3232'
display:none으로 숨겨진 요소는 포함되지 않는다는 점이 특징입니다.
textContent를 사용하면 숨겨진 요소를 포함한 모든 텍스트 노드를 가져옵니다.
address_p.get_attribute('textContent')
# 결과: '\n 서울특별시 강남구 테헤란로 숨겨진텍스트 427\n 1522-3232\n'
태그는 제거되지만 display:none인 요소의 텍스트도 포함된다는 점에서 innerText와 차이가 있습니다.
(3) 정리
| innerHTML | O | O | 보통 |
| innerText | X | X | 느림 |
| textContent | X | O | 빠름 |
스타벅스 주소 크롤링 예제처럼 단순히 텍스트만 필요한 경우에는 textContent가 가장 적합한 선택입니다. 숨겨진 요소가 있더라도 .split()으로 불필요한 부분을 잘라낼 수 있고, innerText보다 속도도 빠르기 때문입니다.
innerText를 사용할 순 있겠지만 화면에 나온 요소만 출력하기 때문에 크롤링 시 scroll을 하는 동작을 추가해야하기 때문에 한번에 화면에 있는 내용을 다 가져오기에는 부적합합니다.
'Python' 카테고리의 다른 글
| [Python] 성능 병목을 찾는 방법 '프로파일링' (0) | 2026.06.28 |
|---|---|
| [Python] sort(), reverse()정리 (0) | 2026.03.27 |
| [Python] 정규표현식 (0) | 2026.03.13 |
| [Python] pytest를 이용한 테스트 코드 작성법 (0) | 2026.03.11 |
| [Python] json.dumps() 사용법, 사용이유 (1) | 2026.03.10 |