• 목록
  • 아래로
  • 위로



안녕하세요?


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


이번 강좌에서는 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명이 추천

추천인 3

작성자
이니스프리 119 Lv. (0%) 1875900/115200000EXP

당분간 일신상의 사정으로 쪽지나 댓글로 답변을 드리기 어렵습니다. 죄송합니다.

 

CSVpuymXAAAVVpd.jpg

댓글 10

말카
허접하지 않습니다. 감사할 뿐입니다.
comment menu
2020.02.23. 09:06

신고

"말카님의 댓글"

이 댓글을 신고 하시겠습니까?

이니스프리 작성자 → 말카
profile image
그렇게 말씀해주셔서 감사합니다 ^^
말카 님께서도 즐거운 주말 되세요~!
comment menu
2020.02.23. 18:14

신고

"이니스프리님의 댓글"

이 댓글을 신고 하시겠습니까?

GsusWeb
이건 파이썬 코드인가요?
1도 모르지만, 아름다운 비누 이야기는 들어본 것 같아서요.
comment menu
2020.06.19. 18:15

신고

"GsusWeb님의 댓글"

이 댓글을 신고 하시겠습니까?

이니스프리 작성자 → GsusWeb
profile image
옙 파이썬의 BeautifulSoup 모듈에 대한 설명이 맞아요! ^-^

특별한 사정이 없으면 이 강좌에서는 파이썬을 다루고 있거든요~
comment menu
2020.06.19. 19:29

신고

"이니스프리님의 댓글"

이 댓글을 신고 하시겠습니까?

GsusWeb → 이니스프리
강의를 하실 정도라니 대단하시네요.
저도 언젠간 파이썬의 필요성을 깨닫게 되면 이니스프리님의 강좌를 보게 될 날이 오겠죠?ㅎ
comment menu
2020.06.19. 20:28

신고

"GsusWeb님의 댓글"

이 댓글을 신고 하시겠습니까?

이니스프리 작성자 → GsusWeb
profile image
허걱~ 강좌는 마스터 님께 신청만 하면 누구나 할 수 있어요 ㄷㄷ

저같이 실력도 없고 개발자도 아닌 사람도 강좌를 하니깐요~! ^^

제 강좌보다는 다른 회원분들의 훌륭한 강좌를 보시길 바랍니다 :)
comment menu
2020.06.19. 22:28

신고

"이니스프리님의 댓글"

이 댓글을 신고 하시겠습니까?

GsusWeb → 이니스프리
+1
정말 코딩 1도 모르던 제가 코딩하겠다고 30일째 씨름중인 거 보면,
참 많은 분들의 도움 덕분이라는 생각이 듭니다.
이니스프리님도 그 중 한 분이고요.^^
comment menu
2020.06.19. 22:40

신고

"GsusWeb님의 댓글"

이 댓글을 신고 하시겠습니까?

이니스프리 작성자 → GsusWeb
profile image
+1
앗 실은 저도 코딩을 시작한지 그리 오래되지 않았어요~! ^^
전공도 코딩과는 전혀 관련이 없구요 ㄷㄷ
저보다 금방 잘 하실거에요!
화이팅이에요 :)
comment menu
2020.06.19. 22:44

신고

"이니스프리님의 댓글"

이 댓글을 신고 하시겠습니까?

GsusWeb → 이니스프리
같이 해요.^^
comment menu
2020.06.19. 22:54

신고

"GsusWeb님의 댓글"

이 댓글을 신고 하시겠습니까?

이니스프리 작성자 → GsusWeb
profile image

존재하지 않는 스티커입니다.

comment menu
2020.06.19. 22:44

신고

"이니스프리님의 댓글"

이 댓글을 신고 하시겠습니까?

권한이 없습니다.
번호 제목 글쓴이 날짜 조회 수
29 [번외편] 네이버 동영상에서 자막을 파일로 추출하는 방법 2 image 이니스프리 이니스프리 19.12.25.22:34 5598
28 [번외편 - 한컴한글] 스마트한 문서 작성을 위한 팁 (작성 중) 이니스프리 이니스프리 20.08.08.13:50 493
27 [번외편 - 유튜브] Youtube API를 이용하거나 또는 이용하지 않고 채널ID를 추출하는 방법 2 image 이니스프리 이니스프리 19.07.16.17:55 2745
26 [번외편 - 아미나] 아미나의 회원 이미지와 관련하여 x2 3 image 이니스프리 이니스프리 18.12.10.19:57 705
25 [번외편 - 아미나] 그누보드/아미나에서 게시글의 날짜를 최종수정일로 변경하고, 목록스킨 및 위젯을 최종수정일 순으로 정렬하기 2 image 이니스프리 이니스프리 18.11.11.22:36 2572
24 [번외편 - 아미나] Basic Youtube Title Widget 1.0에서 처음에 엑박으로 뜨는 경우의 해결책 3 image 이니스프리 이니스프리 18.12.15.23:02 751
23 [번외편 - 법률] 현행 저작권법 제30조(사적이용을 위한 복제)에 대하여 - 음원 다운로더의 처벌과 관련하여 6 이니스프리 이니스프리 18.12.07.14:16 1313
22 [번외편 - 법률] 나무위키의 서술 중 법률용어의 사용에 있어 바로잡아야 할 부분 image 이니스프리 이니스프리 19.07.17.22:44 447
21 [번외편 - 구글뉴스] 리뉴얼된 구글뉴스에서 RSS 피드를 생성하는 방법 6 image 이니스프리 이니스프리 18.10.07.17:58 3532
20 [디지털포렌식전문가] 제21회 필기시험 합격 후기 9 image 이니스프리 이니스프리 23.10.29.16:11 2475
19 [Selenium] Selenium에서 send_keys를 막아놓은 경우 해결책 이니스프리 이니스프리 19.07.04.05:52 4342
18 [Selenium] Requests의 session을 Selenium으로 보내기 image 이니스프리 이니스프리 19.12.07.14:17 4666
17 [Selenium] proxy를 사용하지 않고 개발자도구에서 Network 탭의 로그를 얻기 image 이니스프리 이니스프리 21.03.06.23:35 1555
16 [Requests] Selenium을 이용한 Cloudflare의 우회 8 image 이니스프리 이니스프리 20.01.08.19:51 6245
15 [Requests-HTML] Requests와 비교할 때의 장점! (네이버 뉴스 등 크롤링) 7 image 이니스프리 이니스프리 20.05.14.19:08 1420
14 [Python] 그누보드 자동 글 작성 + 멀티 파일 업로드 스크립트 1 image 이니스프리 이니스프리 21.05.16.09:32 23690
13 [Python] GIF 파일에 프로그레스바 삽입하기! (Adding progress bar into GIF) image 이니스프리 이니스프리 22.05.14.13:14 12581
12 [python-telegram-bot] 4096자 글자수 제한을 우회하는 방법 image 이니스프리 이니스프리 20.01.12.11:25 2049
11 [Pillow] 파이썬 Pillow 라이브러리를 이용하여 이미지의 배경을 transparent하게 만들기 11 image 이니스프리 이니스프리 19.08.04.13:40 7799
[BeautifulSoup] 자식태그를 제거하기 - .decompose() & .extract() 10 image 이니스프리 이니스프리 20.01.16.00:07 9248