인프런 커뮤니티 질문&답변

JAB님의 프로필 이미지
JAB

작성한 질문수

파이썬입문과 크롤링기초 부트캠프 [파이썬, 웹, 데이터 이해 기본까지] (업데이트)

뉴스 제목 추출시 함께 추출되는 숫자없이 제목만 추출하고 싶습니다.

해결된 질문

작성

·

515

1

https://seeko.earlyadopter.co.kr/bbs/board.php?bo_table=mainnews&page=8&page=1

위와 같은 링크로 들어가면 아래와 같은 사이트에 들어가게 됩니다.

각각의 페이지 마다 각 뉴스의 제목들을 따오려고 하는데,

빨간색 네모안에 있는 숫자가 함께 출력이 됩니다.

아마 댓글 수나 좋아요 수를 나타낸 것 같은데, 저 숫자를 제외하고 싶습니다.

copy element 를 해보면 아래와 같이 나옵니다.

<a href="https://seeko.earlyadopter.co.kr/bbs/board.php?bo_table=mainnews&amp;wr_id=745886&amp;page=1" class="item-subject">

<span class="orangered visible-xs pull-right wr-comment">

<i class="fa fa-comment lightgray"></i>

<b>1</b>

</span>

<span class="wr-icon wr-image"></span>

Wi-Fi 6와 Mesh로 무장한 프리미엄 공유기 : 벨롭 MX5300

<span class="count orangered hidden-xs">1</span>

</a>

어찌되었든 제목을 빼오려면 a tag 를 선택을 해야 하는데, 숫자는 a tag 의 하부인 b tag 와 span tag에 있습니다.

즉, 제목만 뽑으려 하니까 숫자도 함께 추출이 되는 상황입니다.

select() 또는 find_all() 에서 추출시 이러한 것을 바로 해결할 수 있는 방법(명령어 등등)이 있나요?

답변 1

2

안녕하세요. 우선 이부분은 한번 공지를 드린적이 있는데요. 다음 설명과 코드를 참고하시면,  타이틀만 정확히 추출하실 수 있습니다. 추가로 이렇게 여러차례 직접 시도를 해보신 것은 정말 잘하신 것입니다. 감사합니다.

최근에 seeko 사이트 페이지가 변경되어, 크롤링 코드를 궁금해하시는 수강생분이 계셔서 간략히 공유드립니다.

강좌에서 가능한 실제 크롤링 예제를 보여드리기 위해, 다양한 실제 사이트를 크롤링하는 코드를 설명드렸는데요. 그러다보니, 실제 사이트의 페이지가 변경이 되어, 크롤링 코드가 정상 동작하지 않는 경우가 있을 수 있습니다.

본 강좌의 목적은 특정 실제 사이트를 크롤링하는 것이 아니라, 크롤링 기술을 익히며, 파이썬과 데이터 수집 기술, 더 나이가 업무 자동화 기술을 익히시는 것이라서요. 만약, 특정 사이트 페이지가 변경되었을 경우에는 강좌에서 익힌 기술을 기반으로 직접 코드를 바꿔보려 노력해보시면 훨씬 도움이 되실 것인데요. 다만, 그래도 실제 변경된 페이지에 대해, 수정된 크롤링 코드를 궁금해하실 수 있어서요. 변경된 seeko 사이트 페이지 크롤링 코드에 대해 참고로 공유드립니다.

우선, 해당 페이지를 크롤링 예제로 보여드린 것은, 크롤링 기술을 선명하게 이해할 수 있기 때문이었는데요. 아쉽게도 변경된 페이지는 크롤링 난이도가 급격히 올라갔습니다. 고급 정규표현식을 잘 이해해야 깔끔하게 크롤링이 가능해서요. 정규표현식도 난이도가 높은 항목을 이해하고 있어야 해서, 해당 부분은 중급단계 강좌인 몽고DB 데이터베이스 강좌 (NoSQL/DB(몽고DB)기초와 파이썬활용 [최신 풀스택/데이터과학 첫걸음]) 에서 설명을 드렸는데요. 해당 표현식은 많이 쓰이지는 않는데, 부득이 변경된 seeko 페이지에서는 사용이 되어서, 다음과 같이 해당 사항을 활용하여 작성을 하였습니다. 

1. 타이틀을 포함하고 있는 a 태그 내에 span, b 태그로 묶여서 타이틀 외의 부가적인 정보가 나오는 부분이 있어서, 해당 부분을 삭제하기 위해

    1.1 추출된 정보를 문자열로 변환한 후, 우선 \n 를 제거

    1.2 span과 b 태그로 묶여진 타이틀 외 부가적 정보를 삭제하기 위해  <span.*?>.*?</span> 와 <b>.*?</b> 정규표현식으로 해당 정보 삭제

    1.3 남겨진 일부 태그를 <.*?> 정규표현식으로 삭제

    1.4 남은 문자열에 있는 탭(\t)을 모두 제거

위와 같은 전략으로, 다음과 같이 작성을 하였습니다. 이 때, .*? 표현식이 바로 중급강좌에서 설명한 Non-Greedy 라고 하는 정규표현식인데요. 해당 부분은 공지로 설명하기는 무리가 있고, 입문 단계에는 필요한 내용은 아니라서, 가이드해드린 강좌를 참고하시거나, Non-Greedy 정규표현식으로 검색을 통해 참고하셔도 좋을 것 같으며, 이 부분은 양해를 부탁드립니다.

다음과 같이 최종 코드를 작성하였고, 아무쪼록 다음 코드가 도움이 되셨으면 좋겠습니다. 감사합니다.

import requests
from bs4 import BeautifulSoup
import re

res = requests.get('https://seeko.earlyadopter.co.kr/bbs/board.php?bo_table=mainnews')
soup = BeautifulSoup(res.content, 'html.parser')
data = soup.findAll('a', 'item-subject')
for item in data:
    item_extract = str(item).replace('\n', '')
    item_extract = re.sub('<span.*?>.*?</span>', '', item_extract)
    item_extract = re.sub('<b>.*?</b>', '', item_extract)    
    item_extract = re.sub('<.*?>', '', item_extract)        
    item_extract = item_extract.replace('\t', '')
    print (item_extract)
JAB님의 프로필 이미지
JAB

작성한 질문수

질문하기