Problem Solving Through Python

|  파이썬을 활용하여 우리가 PC를 사용하면서 접하는 문제를 보다 간단히 해결하는 내용을 다룹니다. - 기초수준

?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄 첨부
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄 첨부



안녕하세요?


날씨가 쌀쌀해졌는데 다들 건강히 계시는지요? ^^


이번 강좌에서는 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()과 유사한 방식으로 작동한다고 생각하시면 됩니다.



읽으시는 분이 거의 안 계시겠지만 제 허접한 강좌를 읽어주시는 분들께 항상 감사드립니다!


항상 느끼는 것이지만 크롤링의 길은 멀고도 험한 것 같네요 ^^


그럼 스포어 회원님들께서도 굿밤 되시고 감기 조심하세요~!


  • ?
    말카 2020.02.23 09:06
    허접하지 않습니다. 감사할 뿐입니다.
  • profile
    이니스프리 2020.02.23 18:14
    그렇게 말씀해주셔서 감사합니다 ^^
    말카 님께서도 즐거운 주말 되세요~!

Problem Solving Through Python

파이썬을 활용하여 우리가 PC를 사용하면서 접하는 문제를 보다 간단히 해결하는 내용을 다룹니다. - 기초수준

List of Articles
번호 제목 글쓴이 날짜 조회 수
22 22. [OpenPyXL] 엑셀 문서 저장하기 / 시트 추가하기 / 셀에 입력하기 14 file 이니스프리 2020.02.02 240
21 21. [OpenPyXL] 엑셀 문서를 열고 시트에서 셀의 값을 얻기 2 file 이니스프리 2020.02.01 109
» [BeautifulSoup] 자식태그를 제거하기 - .decompose() & .extract() 2 file 이니스프리 2020.01.16 191
19 [python-telegram-bot] 4096자 글자수 제한을 우회하는 방법 file 이니스프리 2020.01.12 153
18 [Requests] Selenium을 이용한 Cloudflare의 우회 3 file 이니스프리 2020.01.08 193
17 9. 파이썬 문법 팁 정리 file 이니스프리 2020.01.04 151
16 [번외편] 네이버 동영상에서 자막을 파일로 추출하는 방법 2 file 이니스프리 2019.12.25 252
15 4. 문자열 처리 (2) - 문자열 조작에 대한 기본함수 및 메서드 1 file 이니스프리 2019.12.12 162
14 6. 리스트와 관련된 기본함수 및 메서드 7 file 이니스프리 2019.12.10 200
13 3. 문자열 처리 (1) - 문자열 접근 및 검색방법 4 file 이니스프리 2019.12.09 755
12 [Selenium] Requests의 session을 Selenium으로 보내기 file 이니스프리 2019.12.07 255
11 1. 반복문 (1) - while 문 5 file 이니스프리 2019.12.06 137
10 (序) Python 강좌를 시작하며... 2 file 이니스프리 2019.12.05 107
9 [Pillow] 파이썬 Pillow 라이브러리를 이용하여 이미지의 배경을 transparent하게 만들기 11 file 이니스프리 2019.08.04 608
8 [번외편 - 법률] 나무위키의 서술 중 법률용어의 사용에 있어 바로잡아야 할 부분 file 이니스프리 2019.07.17 179
7 [번외편 - 유튜브] Youtube API를 이용하거나 또는 이용하지 않고 채널ID를 추출하는 방법 1 file 이니스프리 2019.07.16 428
6 [Selenium] Selenium에서 send_keys를 막아놓은 경우 해결책 이니스프리 2019.07.04 336
5 [번외편 - 아미나] Basic Youtube Title Widget 1.0에서 처음에 엑박으로 뜨는 경우의 해결책 3 file 이니스프리 2018.12.15 453
4 [번외편 - 아미나] 아미나의 회원 이미지와 관련하여 x2 3 file 이니스프리 2018.12.10 427
3 [번외편 - 법률] 현행 저작권법 제30조(사적이용을 위한 복제)에 대하여 - 음원 다운로더의 처벌과 관련하여 6 이니스프리 2018.12.07 737
목록
Board Pagination Prev 1 ... 2 Next
/ 2
서버에 요청 중입니다. 잠시만 기다려 주십시오...