- 10
- 이니스프리
- 조회 수 9464
안녕하세요?
날씨가 쌀쌀해졌는데 다들 건강히 계시는지요? ^^
이번 강좌에서는 BeautifulSoup에서 상대적으로 덜 사용되지만 유용한 두 메서드를 다뤄보고자 합니다.
BeautifulSoup을 사용하다보면 자식태그를 제외하고 부모태그의 텍스트만을 추출해야 되는 경우가 있습니다.
예시로서 MLBPark의 게시판 소스를 조금 변형하여 설명하겠습니다.
아래와 같은 HTML 소스가 있을 때 '[3]'을 제외하고 '2010년대 선발진 완봉 top 7 '만을 출력하려면 어떻게 해야될까요??
(단, 정규표현식을 사용하거나, 문자열 자체를 조작하는 방법은 고려하지 않습니다.)
<a href="http://mlbpark.donga.com/b.php?id=1150039147314">2010년대 선발진 완봉 top 7 <span class="replycnt">[3]</span></a>
단순히 select_one('a').text를 한다면 '2010년대 선발진 완봉 top 7 [3]'이란 결과를 리턴하게 됩니다.
물론 .split(' [')[0]을 고려할 수도 있겠지만, 이러한 방법은 글 작성자가 제목에 대괄호를 사용하는 경우에 원하지 않는 엉뚱한 결과를 초래할 수 있습니다 ㄷㄷ
따라서 부모태그만을 추출할 수 있는 방법을 택해야 합니다.
이를 달성하기 위한 여러 방법이 있겠지만, 가장 직관적인 방법은 자식태그를 제거하는 것입니다.
이 때 사용하는 메서드가 바로 .decompose()입니다.
.decompose() 메서드에 대해서는 공식문서에 다음과 같이 설명되어 있습니다.
"Tag.decompose() removes a tag from the tree, then completely destroys it and its contents."
따라서 select_one('a').span.decompose().text를 하면 '2010년대 선발진 완봉 top 7 '을 얻어낼 수 있습니다.
한편 이와 유사한 메서드로 .extract()가 있습니다.
공식문서에 따르면 다음과 같은 역할을 합니다.
"PageElement.extract() removes a tag or string from the tree. It returns the tag or string that was extracted"
.decompose()는 None을 리턴하는 반면, .extract()는 제거된 태그를 리턴합니다.
.extract()는 제거된 태그를 리턴한다는 점에서 리스트에서의 .pop()과 유사한 방식으로 작동한다고 생각하시면 됩니다.
읽으시는 분이 거의 안 계시겠지만 제 허접한 강좌를 읽어주시는 분들께 항상 감사드립니다!
항상 느끼는 것이지만 크롤링의 길은 멀고도 험한 것 같네요 ^^
그럼 스포어 회원님들께서도 굿밤 되시고 감기 조심하세요~!
추천인 3
작성자
댓글 10
말카 님께서도 즐거운 주말 되세요~!
1도 모르지만, 아름다운 비누 이야기는 들어본 것 같아서요.
특별한 사정이 없으면 이 강좌에서는 파이썬을 다루고 있거든요~
저도 언젠간 파이썬의 필요성을 깨닫게 되면 이니스프리님의 강좌를 보게 될 날이 오겠죠?ㅎ
저같이 실력도 없고 개발자도 아닌 사람도 강좌를 하니깐요~! ^^
제 강좌보다는 다른 회원분들의 훌륭한 강좌를 보시길 바랍니다 :)
참 많은 분들의 도움 덕분이라는 생각이 듭니다.
이니스프리님도 그 중 한 분이고요.^^
전공도 코딩과는 전혀 관련이 없구요 ㄷㄷ
저보다 금방 잘 하실거에요!
화이팅이에요 :)
존재하지 않는 스티커입니다.