파이썬

파이썬 웹 크롤링 3. find_all, import re, get text

mcdn 2020. 8. 24. 17:23
반응형
1. find_all 옵션 처음 써보기
import requests
from bs4 import BeautifulSoup

webpage = requests.get("https://www.daangn.com/hot_articles")
soup = BeautifulSoup(webpage.content, "html.parser")

print(soup.find_all("h2"))

지금까지 태그를 확인하는 감을 익혔다면 이번엔 원하는 부분을 모두 가져올 수 있는 .find_all()을 익힐 차례다. 싹 다 긁어오는 .find_all()이 유용한 가장 큰 이유는 정규식, html 속성, 함수 등을 사용해서 좀 더 스마트하게 내가 원하는 부분을 추출할 수 있기 때문이다.

[<h2 class="card-title">이케아 수납장(1세트 3쪽)</h2>, <h2 class="card-title">MOTTO 자전거 판매합니다</h2>, <h2 class="card-title">휘센제습기</h2>, <h2 class="card-title">위닉스 제습기</h2>, <h2 class="card-title">위닉스 제습기</h2>, <h2 class="card-title">위닉스 제습기 16리터 팝니다.</h2>, <h2 class="card-title">위닉스 뽀송 제습기 16L 판매합니다</h2>, <h2 class="card-title">밥솥 , 에어컨 3종, 이동식 제습기 , 런닝머신 , 전자레인지 , 화장실 온열기 , 바닥 밀대 팝니다 </h2>, <h2 class="card-title">캠핑의자</h2>, <h2 class="card-title">LG제습기 판매합니다</h2>, <h2 class="card-title">제습기</h2>, <h2 class="card-title">제습기</h2>, <h2 class="card-title">자전거 팝니다.</h2>, <h2 class="card-title">삼천리 Appalanchia 26인치 하이브리드 자전거 팝니다.</h2>, <h2 class="card-title">제습기 팔아요</h2>, <h2 class="card-title">코베아 캠핑 벤치의자</h2>, <h2 class="card-title">허먼밀러의자</h2>, <h2 class="card-title">위닉스 제습기 10리터(DHH-100BNR)</h2>, <h2 class="card-title">란탄   서랍장  4단 ,3단</h2>, <h2 class="card-title">제습기</h2>, <h2 class="card-title">마키다 전동드릴</h2>, <h2 class="card-title">쿠첸 제습기</h2>, <h2 class="card-title">세탁기 ,냉장고 같이 십만원에 처분합니다</h2>, <h2 class="card-title">엑스바이크 실내자전거</h2>, <h2 class="card-title">위니아 제습기 10리터</h2>, <h2 class="card-title">4단 철제망 선반</h2>, <h2 class="card-title">바이레도 라튤립 팝니다~</h2>, <h2 class="card-title">우유200ml 판매합니다</h2>, <h2 class="card-title">코치 가방</h2>, <h2 class="card-title">삼성 제습기</h2>, <h2 class="card-title">사무실 냉장고 판매</h2>, <h2 class="card-title">제습기</h2>, <h2 class="card-title">제습기</h2>, <h2 class="card-title">티티카카접이식자전거</h2>, <h2 class="card-title">노부영영어 홈쇼핑 33+7+cd</h2>, <h2 class="card-title">원목 선반 팔아요</h2>, <h2 class="card-title">수납장 선반 가구 청소기 식탁 테이블 아무거나 각5천원</h2>, <h2 class="card-title">삼성 전자렌지 드림합니다</h2>, <h2 class="card-title">위닉스 제습기</h2>, <h2 class="card-title">위닉스 16 리터 제습기..3번 사용 했어요..</h2>, <h2 class="card-title">구찌 백</h2>, <h2 class="card-title">(이사정리)냉장고/김치냉장고/세탁기</h2>, <h2 class="card-title">가성비 좋은 게이밍 컴퓨터 본체 팝니다</h2>, <h2 class="card-title">삼성제습기 AY130FBVAWQD (새제품)</h2>, <h2 class="card-title">2.5마력(계양) 콤프레샤 팝니다</h2>, <h2 class="card-title">다이슨 에어랩 판매합니다</h2>, <h2 class="card-title">서울우유</h2>, <h2 class="card-title">자전거 판매</h2>, <h2 class="card-title">캠핑웨건 판매합니다</h2>, <h2 class="card-title">앵글 선반 팝니다~</h2>, <h2 class="card-title">한일 제습기 판매합니다</h2>, <h2 class="card-title">위니아 제습기 11리터</h2>, <h2 class="card-title">제습기 드림 챗이 많아 답을 못드려요ㅜㅡㅜ</h2>, <h2 class="card-title">턱걸이 팝니다</h2>, <h2 class="card-title">콘솔</h2>, <h2 class="card-title">의자  무료 필요하신분 가져가세요</h2>, <h2 class="card-title">노비타 제습기 상태 좋음</h2>, <h2 class="card-title">고야드 클러치 정품</h2>, <h2 class="card-title">선반</h2>, <h2 class="card-title">골프모자</h2>, <h2 class="card-title">자전거 팝니다</h2>, <h2 class="card-title">제습기</h2>, <h2 class="card-title">오단서랍장</h2>, <h2 class="card-title">타이틀리스트 여성 골프채 세트</h2>, <h2 class="card-title">이케아 슈퍼싱글 침대 가져가세요~</h2>, <h2 class="card-title">위닉스 제습기 팔아요</h2>, <h2 class="card-title">로드 자전거 급처</h2>, <h2 class="card-title">lg디오스 김치냉장고</h2>, <h2 class="card-title">초등학생자전거</h2>, <h2 class="card-title">알톤 미너스 자전거</h2>, <h2 class="card-title">대우냉장고 판매합니다(237L)</h2>, <h2 class="card-title">앤틱 시계</h2>, <h2 class="card-title">행복한명작</h2>, <h2 class="card-title">메쉬 틈새 선반 드림</h2>, <h2 class="card-title">디지털피아노</h2>, <h2 class="card-title">스토케 트립트랩</h2>, <h2 class="card-title">헤라 남성 화장품</h2>, <h2 class="card-title">갤럭시워치 LTE 블랙 5만원</h2>, <h2 class="card-title">삼성 전자레인지</h2>, <h2 class="card-title">민물낚시대</h2>, <h2 class="card-title">엘지 티비 </h2>, <h2 class="card-title">8kg 아령</h2>, <h2 class="card-title">원목선반</h2>, <h2 class="card-title">웅진 코웨이 제습기  팝니다</h2>, <h2 class="card-title">삼성제습기15L</h2>, <h2 class="card-title">샤넬 마모아드젤 향수</h2>, <h2 class="card-title">위닉스 뽀송제습기(16L)</h2>, <h2 class="card-title">서큐레이터선풍기</h2>, <h2 class="card-title">철제 선반장</h2>, <h2 class="card-title">4단 철제 선반</h2>, <h2 class="card-title">진열대</h2>, <h2 class="card-title">드롱기 커피 원두 그라인더</h2>, <h2 class="card-title">실내자전거</h2>, <h2 class="card-title">LG  32인치 TV 팔아요</h2>, <h2 class="card-title">오단서랍장</h2>, <h2 class="card-title">자전거</h2>]

 길게 출력되는게 문제긴 하지만

종류를 모두 프린트 해줌! 

import requests
from bs4 import BeautifulSoup

webpage = requests.get("https://www.daangn.com/hot_articles")
soup = BeautifulSoup(webpage.content, "html.parser")

print(soup.find_all(['h1', 'p']))

.find_all()를 사용하면 리스트로 원하는 태그들을 지정해서 뽑을 수도 있다. 예를 들어 h1, p 태그만 보고 싶다면 이렇게.

 

[<h1 id="fixed-bar-logo-title">
<a href="https://www.daangn.com/">
<span class="sr-only">당근마켓</span>
<img alt="당근마켓" class="fixed-logo" src="https://d1unjqcospf8gs.cloudfront.net/assets/home/base/header/logo-basic-00b7e471b721ce9db8b0758c05a84684413c8aef1ad54caa0f3fcbe7328c947f.svg"/>
</a> </h1>, <h1 class="head-title" id="hot-articles-head-title">
    
    
    인기 중고 매물
  </h1>, <p>당근마켓 앱에서 따뜻한 거래를 직접 경험해보세요!</p>]

 

띄어쓰기 안됨 ㅋㅋㅋ

 

 

 

2. findall 과 re : import re
import requests
from bs4 import BeautifulSoup
import re

webpage = requests.get("https://www.daangn.com/hot_articles")
soup = BeautifulSoup(webpage.content, "html.parser")

print(soup.find_all(re.compile("[ou]l")))

.re 정규식 사용해서 필요한 부분만 볼 수 있다. 

[ou]l 이라든지 

C:\Users\user\PycharmProjects\untitled4\venv\Scripts\python.exe C:/Users/user/PycharmProjects/untitled4/next.py
[<ul class="footer-list trust">
<li class="footer-list-item"><a class="trust-link" href="/trust">믿을 수 있는 중고거래</a></li>
<li class="footer-list-item"><a class="trust-link" href="/wv/faqs">자주 묻는 질문</a></li>
</ul>, <ul class="footer-list">
<li class="footer-list-item"><a href="http://team.daangn.com" target="_blank">회사 소개</a></li>
<li class="footer-list-item"><a href="https://ad.daangn.com/" target="_blank">광고주센터</a></li>
<li class="footer-list-item"><a href="https://policy.daangn.com/terms.html" target="_blank">이용약관</a></li>
<li class="footer-list-item"><a href="https://policy.daangn.com/privacy.html" target="_blank">개인정보취급방침</a></li>
<li class="footer-list-item"><a href="https://policy.daangn.com/location.html" target="_blank">위치기반서비스 이용약관</a></li>
</ul>, <ul class="footer-list contact">
<li class="footer-list-item">고객문의 <a href="mailto:cs@daangnservice.com">cs@daangnservice.com</a></li>
<li class="footer-list-item">제휴문의 <a href="mailto:contact@daangn.com">contact@daangn.com</a></li>
</ul>, <ul class="social-list">
<li class="social-list-item">
<a class="footer-social-link" href="https://www.facebook.com/daangn" target="_blank">
<img alt="facebook" src="https://d1unjqcospf8gs.cloudfront.net/assets/home/base/footer/icon-facebook-bde8a76b313d1ccb4b3c400693640976c6011a4468784221b19e89207320ef53.svg"/>
<span class="sr-only">facebook</span>
</a> </li>
<li class="social-list-item">
<a class="footer-social-link" href="https://www.instagram.com/daangnmarket/" target="_blank">
<img alt="instagram" src="https://d1unjqcospf8gs.cloudfront.net/assets/home/base/footer/icon-instagram-190db7b2d8363fe4bb4c38ea8e0dc38bfa29944f2ef0cee5205dc9c2fe877f72.svg"/>
<span class="sr-only">instagram</span>
</a> </li>
<li class="social-list-item">
<a class="footer-social-link" href="https://blog.naver.com/daangn" target="_blank">
<img alt="blog" src="https://d1unjqcospf8gs.cloudfront.net/assets/home/base/footer/icon-blog-248231f037fd77f7706544a5d770ec50f0985a23bad4e76559674b63d98a44cd.svg"/>
<span class="sr-only">blog</span>
</a> </li>
</ul>, <ul class="copyright-list">
<li class="copyright-list-item">사업자 등록번호 : 375-87-00088</li>
<li class="copyright-list-item"><address>서울특별시 구로구 디지털로 30길 28 609호</address></li>
</ul>]

Process finished with exit code 0

 

print(soup.find_all(re.compile("h[1-9]")))

.h[1-9]라든지 정규식으로 필요한 부분 보기 가능!

C:\Users\user\PycharmProjects\untitled4\venv\Scripts\python.exe C:/Users/user/PycharmProjects/untitled4/next.py
[<h1 id="fixed-bar-logo-title">
<a href="https://www.daangn.com/">
<span class="sr-only">당근마켓</span>
<img alt="당근마켓" class="fixed-logo" src="https://d1unjqcospf8gs.cloudfront.net/assets/home/base/header/logo-basic-00b7e471b721ce9db8b0758c05a84684413c8aef1ad54caa0f3fcbe7328c947f.svg"/>
</a> </h1>, <h3 class="hide">다운로드</h3>, <h1 class="head-title" id="hot-articles-head-title">
    
    
    인기 중고 매물
  </h1>, <h2 class="card-title">이케아 수납장(1세트 3쪽)</h2>, <h2 class="card-title">MOTTO 자전거 판매합니다</h2>, <h2 class="card-title">위닉스 제습기</h2>, <h2 class="card-title">휘센제습기</h2>, <h2 class="card-title">위닉스 제습기</h2>, <h2 class="card-title">위닉스 제습기 16리터 팝니다.</h2>, <h2 class="card-title">위닉스 뽀송 제습기 16L 판매합니다</h2>, <h2 class="card-title">밥솥 , 에어컨 3종, 런닝머신 , 전자레인지 , 화장실 온열기 , 바닥 밀대 팝니다 </h2>, <h2 class="card-title">캠핑의자</h2>, <h2 class="card-title">LG제습기 판매합니다</h2>, <h2 class="card-title">제습기</h2>, <h2 class="card-title">제습기</h2>, <h2 class="card-title">자전거 팝니다.</h2>, <h2 class="card-title">삼천리 Appalanchia 26인치 하이브리드 자전거 팝니다.</h2>, <h2 class="card-title">제습기 팔아요</h2>, <h2 class="card-title">코베아 캠핑 벤치의자</h2>, <h2 class="card-title">허먼밀러의자</h2>, <h2 class="card-title">위닉스 제습기 10리터(DHH-100BNR)</h2>, <h2 class="card-title">란탄   서랍장  4단 ,3단</h2>, <h2 class="card-title">제습기</h2>, <h2 class="card-title">마키다 전동드릴</h2>, <h2 class="card-title">쿠첸 제습기</h2>, <h2 class="card-title">세탁기 ,냉장고 같이 십만원에 처분합니다</h2>, <h2 class="card-title">엑스바이크 실내자전거</h2>, <h2 class="card-title">위니아 제습기 10리터</h2>, <h2 class="card-title">바이레도 라튤립 팝니다~</h2>, <h2 class="card-title">우유200ml 판매합니다</h2>, <h2 class="card-title">코치 가방</h2>, <h2 class="card-title">삼성 제습기</h2>, <h2 class="card-title">4단 철제망 선반</h2>, <h2 class="card-title">사무실 냉장고 판매</h2>, <h2 class="card-title">제습기</h2>, <h2 class="card-title">제습기</h2>, <h2 class="card-title">티티카카접이식자전거</h2>, <h2 class="card-title">수납장 선반 가구 청소기 식탁 테이블 아무거나 각5천원</h2>, <h2 class="card-title">노부영영어 홈쇼핑 33+7+cd</h2>, <h2 class="card-title">삼성 전자렌지 드림합니다</h2>, <h2 class="card-title">원목 선반 팔아요</h2>, <h2 class="card-title">위닉스 제습기</h2>, <h2 class="card-title">위닉스 16 리터 제습기..3번 사용 했어요..</h2>, <h2 class="card-title">구찌 백</h2>, <h2 class="card-title">(이사정리)냉장고/김치냉장고/세탁기</h2>, <h2 class="card-title">가성비 좋은 게이밍 컴퓨터 본체 팝니다</h2>, <h2 class="card-title">삼성제습기 AY130FBVAWQD (새제품)</h2>, <h2 class="card-title">2.5마력(계양) 콤프레샤 팝니다</h2>, <h2 class="card-title">다이슨 에어랩 판매합니다</h2>, <h2 class="card-title">서울우유</h2>, <h2 class="card-title">자전거 판매</h2>, <h2 class="card-title">캠핑웨건 판매합니다</h2>, <h2 class="card-title">앵글 선반 팝니다~</h2>, <h2 class="card-title">한일 제습기 판매합니다</h2>, <h2 class="card-title">위니아 제습기 11리터</h2>, <h2 class="card-title">제습기 드림 챗이 많아 답을 못드려요ㅜㅡㅜ</h2>, <h2 class="card-title">턱걸이 팝니다</h2>, <h2 class="card-title">콘솔</h2>, <h2 class="card-title">의자  무료 필요하신분 가져가세요</h2>, <h2 class="card-title">고야드 클러치 정품</h2>, <h2 class="card-title">선반</h2>, <h2 class="card-title">골프모자</h2>, <h2 class="card-title">자전거 팝니다</h2>, <h2 class="card-title">디지털피아노</h2>, <h2 class="card-title">오단서랍장</h2>, <h2 class="card-title">타이틀리스트 여성 골프채 세트</h2>, <h2 class="card-title">이케아 슈퍼싱글 침대 가져가세요~</h2>, <h2 class="card-title">위닉스 제습기 팔아요</h2>, <h2 class="card-title">노비타 제습기 상태 좋음</h2>, <h2 class="card-title">로드 자전거 급처</h2>, <h2 class="card-title">lg디오스 김치냉장고</h2>, <h2 class="card-title">초등학생자전거</h2>, <h2 class="card-title">대우냉장고 판매합니다(237L)</h2>, <h2 class="card-title">앤틱 시계</h2>, <h2 class="card-title">제습기</h2>, <h2 class="card-title">스토케 트립트랩</h2>, <h2 class="card-title">헤라 남성 화장품</h2>, <h2 class="card-title">알톤 미너스 자전거</h2>, <h2 class="card-title">갤럭시워치 LTE 블랙 5만원</h2>, <h2 class="card-title">삼성 전자레인지</h2>, <h2 class="card-title">민물낚시대</h2>, <h2 class="card-title">엘지 티비 </h2>, <h2 class="card-title">8kg 아령</h2>, <h2 class="card-title">원목선반</h2>, <h2 class="card-title">행복한명작</h2>, <h2 class="card-title">웅진 코웨이 제습기  팝니다</h2>, <h2 class="card-title">메쉬 틈새 선반 드림</h2>, <h2 class="card-title">삼성제습기15L</h2>, <h2 class="card-title">샤넬 마모아드젤 향수</h2>, <h2 class="card-title">위닉스 뽀송제습기(16L)</h2>, <h2 class="card-title">철제 선반장</h2>, <h2 class="card-title">진열대</h2>, <h2 class="card-title">드롱기 커피 원두 그라인더</h2>, <h2 class="card-title">실내자전거</h2>, <h2 class="card-title">서큐레이터선풍기</h2>, <h2 class="card-title">오단서랍장</h2>, <h2 class="card-title">자전거</h2>, <h2 class="card-title">스팸 클래식</h2>, <h2 class="card-title">삼성 제습기 판매해요</h2>, <h2 class="card-title">4단 철제 선반</h2>, <h3>
        더 구경하고 싶나요?
    </h3>]

Process finished with exit code 0

띄어쓰기 안됨 ㅋㅋㅋ

 

 

 

3) html 속성 활용하기

html 속성을 지정해서 뽑을 수도 있다. .find_all() 괄호 안에 attrs 파라미터를 지정하면 된다. 딕셔너리 형태로.

만약 introduction-detail이라는 이름의 class만 긁어오고 싶다면 이렇게.

soup.find_all(attrs={'class':'card-title'})

당연히 속성을 여러개 지정하는 것도 가능하다.

soup.find_all(attrs={'class':'footer-list', 'id':'footer-address-list'})

 

[<h2 class="card-title">이케아 수납장(1세트 3쪽)</h2>, <h2 class="card-title">MOTTO 자전거 판매합니다</h2>, <h2 class="card-title">위닉스 제습기</h2>, <h2 class="card-title">휘센제습기</h2>, <h2 class="card-title">위닉스 제습기</h2>, <h2 class="card-title">위닉스 제습기 16리터 팝니다.</h2>, <h2 class="card-title">위닉스 뽀송 제습기 16L 판매합니다</h2>, <h2 class="card-title">밥솥 , 에어컨 3종, 런닝머신 , 전자레인지 , 화장실 온열기 , 바닥 밀대 팝니다 </h2>, <h2 class="card-title">캠핑의자</h2>, <h2 class="card-title">LG제습기 판매합니다</h2>, <h2 class="card-title">제습기</h2>, <h2 class="card-title">제습기</h2>, <h2 class="card-title">자전거 팝니다.</h2>, <h2 class="card-title">삼천리 Appalanchia 26인치 하이브리드 자전거 팝니다.</h2>, <h2 class="card-title">코베아 캠핑 벤치의자</h2>, <h2 class="card-title">제습기 팔아요</h2>, <h2 class="card-title">허먼밀러의자</h2>, <h2 class="card-title">란탄   서랍장  4단 ,3단</h2>, <h2 class="card-title">위닉스 제습기 10리터(DHH-100BNR)</h2>, <h2 class="card-title">제습기</h2>, <h2 class="card-title">마키다 전동드릴</h2>, <h2 class="card-title">쿠첸 제습기</h2>, <h2 class="card-title">세탁기 ,냉장고 같이 십만원에 처분합니다</h2>, <h2 class="card-title">엑스바이크 실내자전거</h2>, <h2 class="card-title">위니아 제습기 10리터</h2>, <h2 class="card-title">가성비 좋은 게이밍 컴퓨터 본체 팝니다</h2>, <h2 class="card-title">코치 가방</h2>, <h2 class="card-title">삼성 제습기</h2>, <h2 class="card-title">4단 철제망 선반</h2>, <h2 class="card-title">사무실 냉장고 판매</h2>, <h2 class="card-title">바이레도 라튤립 팝니다~</h2>, <h2 class="card-title">제습기</h2>, <h2 class="card-title">우유200ml 판매합니다</h2>, <h2 class="card-title">티티카카접이식자전거</h2>, <h2 class="card-title">제습기</h2>, <h2 class="card-title">수납장 선반 가구 청소기 식탁 테이블 아무거나 각5천원</h2>, <h2 class="card-title">노부영영어 홈쇼핑 33+7+cd</h2>, <h2 class="card-title">삼성 전자렌지 드림합니다</h2>, <h2 class="card-title">원목 선반 팔아요</h2>, <h2 class="card-title">위닉스 제습기</h2>, <h2 class="card-title">위닉스 16 리터 제습기..3번 사용 했어요..</h2>, <h2 class="card-title">구찌 백</h2>, <h2 class="card-title">(이사정리)냉장고/김치냉장고/세탁기</h2>, <h2 class="card-title">삼성제습기 AY130FBVAWQD (새제품)</h2>, <h2 class="card-title">2.5마력(계양) 콤프레샤 팝니다</h2>, <h2 class="card-title">다이슨 에어랩 판매합니다</h2>, <h2 class="card-title">서울우유</h2>, <h2 class="card-title">자전거 판매</h2>, <h2 class="card-title">한일 제습기 판매합니다</h2>, <h2 class="card-title">위니아 제습기 11리터</h2>, <h2 class="card-title">제습기 드림 챗이 많아 답을 못드려요ㅜㅡㅜ</h2>, <h2 class="card-title">턱걸이 팝니다</h2>, <h2 class="card-title">콘솔</h2>, <h2 class="card-title">의자  무료 필요하신분 가져가세요</h2>, <h2 class="card-title">캠핑웨건 판매합니다</h2>, <h2 class="card-title">고야드 클러치 정품</h2>, <h2 class="card-title">앵글 선반 팝니다~</h2>, <h2 class="card-title">선반</h2>, <h2 class="card-title">골프모자</h2>, <h2 class="card-title">디지털피아노</h2>, <h2 class="card-title">오단서랍장</h2>, <h2 class="card-title">이케아 슈퍼싱글 침대 가져가세요~</h2>, <h2 class="card-title">위닉스 제습기 팔아요</h2>, <h2 class="card-title">노비타 제습기 상태 좋음</h2>, <h2 class="card-title">로드 자전거 급처</h2>, <h2 class="card-title">lg디오스 김치냉장고</h2>, <h2 class="card-title">자전거 팝니다</h2>, <h2 class="card-title">초등학생자전거</h2>, <h2 class="card-title">대우냉장고 판매합니다(237L)</h2>, <h2 class="card-title">앤틱 시계</h2>, <h2 class="card-title">제습기</h2>, <h2 class="card-title">타이틀리스트 여성 골프채 세트</h2>, <h2 class="card-title">스토케 트립트랩</h2>, <h2 class="card-title">헤라 남성 화장품</h2>, <h2 class="card-title">알톤 미너스 자전거</h2>, <h2 class="card-title">갤럭시워치 LTE 블랙 5만원</h2>, <h2 class="card-title">민물낚시대</h2>, <h2 class="card-title">엘지 티비 </h2>, <h2 class="card-title">8kg 아령</h2>, <h2 class="card-title">원목선반</h2>, <h2 class="card-title">행복한명작</h2>, <h2 class="card-title">웅진 코웨이 제습기  팝니다</h2>, <h2 class="card-title">메쉬 틈새 선반 드림</h2>, <h2 class="card-title">삼성제습기15L</h2>, <h2 class="card-title">샤넬 마모아드젤 향수</h2>, <h2 class="card-title">철제 선반장</h2>, <h2 class="card-title">삼성 전자레인지</h2>, <h2 class="card-title">진열대</h2>, <h2 class="card-title">드롱기 커피 원두 그라인더</h2>, <h2 class="card-title">실내자전거</h2>, <h2 class="card-title">위닉스 뽀송제습기(16L)</h2>, <h2 class="card-title">서큐레이터선풍기</h2>, <h2 class="card-title">오단서랍장</h2>, <h2 class="card-title">스팸 클래식</h2>, <h2 class="card-title">삼성 제습기 판매해요</h2>, <h2 class="card-title">4단 철제 선반</h2>]

 

4) 함수 활용하기

원하는 부분을 가져오고 싶은데 의외로 조건이나 규칙을 지정하기 까다로울 수도 있다. 그럴 땐 함수를 만들어서 활용할 수 있다.

def search_function(tag):

return tag.attr('class') == "card-title" and tag.string == "Hello World"



soup.find_all(search_function)

??? 에러가 난다. 

 

 

5. CSS 선택자를 통해 원하는 부분 가져오기
import requests
from bs4 import BeautifulSoup
import re

webpage = requests.get("https://www.daangn.com/hot_articles")
soup = BeautifulSoup(webpage.content, "html.parser")

print(soup.select(".card-region-name"))

 

지금까진 html 태그를 중심으로 원하는 부분을 살펴봤다. 

그래서 select()를 통해 CSS 선택자를 활용하는 방법도 있다.

class 앞에는 .(점)을 찍어주기

예를 들어 card-region-name이라는 클래스를 가진 요소들만 긁어오고 싶다면 이렇게

print(soup.select(".card-region-name"))

 

C:\Users\user\PycharmProjects\untitled4\venv\Scripts\python.exe C:/Users/user/PycharmProjects/untitled4/next.py
[<div class="card-region-name">
        대구 수성구 만촌2동
      </div>, <div class="card-region-name">
        경기도 고양시 일산동구 풍산동
      </div>, <div class="card-region-name">
        서울 송파구 잠실동
      </div>, <div class="card-region-name">
        부산 사상구 주례제1동
      </div>, <div class="card-region-name">
        서울 중랑구 묵제1동
      </div>, <div class="card-region-name">
        경남 창원시 의창구 팔룡동
      </div>, <div class="card-region-name">
        광주 서구 풍암동
      </div>, <div class="card-region-name">
        서울 용산구 청파동
      </div>, <div class="card-region-name">
        인천 남동구 논현1동
      </div>, <div class="card-region-name">
        세종시  아름동
      </div>, <div class="card-region-name">
        경기도 용인시 수지구 상현동
      </div>, <div class="card-region-name">
        대구 중구 남산1동
      </div>, <div class="card-region-name">
        서울 송파구 가락동
      </div>, <div class="card-region-name">
        경기도 용인시 기흥구 보정동
      </div>, <div class="card-region-name">
        전남 순천시 해룡면
      </div>, <div class="card-region-name">
        경기도 고양시 일산서구 주엽2동
      </div>, <div class="card-region-name">
        서울 서초구 잠원동
 

Process finished with exit code 0

id앞에는 #(샵)을 찍어주기

예를 들어 hot-articles-go-download라는 id를 가진 요소들만 긁어오고 싶다면 이렇게

print(soup.select("#hot-articles-go-download"))
C:\Users\user\PycharmProjects\untitled4\venv\Scripts\python.exe C:/Users/user/PycharmProjects/untitled4/next.py
[<section id="hot-articles-go-download">
<h3>
        더 구경하고 싶나요?
    </h3>
<p>당근마켓 앱에서 따뜻한 거래를 직접 경험해보세요!</p>
<div id="hot-articles-download-buttons">
<a class="download-button" href="https://itunes.apple.com/kr/app/pangyojangteo/id1018769995?l=ko&amp;ls=1&amp;mt=8" target="_blank">
<div class="home-apple-store-bar-white"></div>
<div class="download-text">App Store</div>
</a> <a class="download-button" href="https://play.google.com/store/apps/details?id=com.towneers.www" target="_blank">
<div class="home-google-play-bar-white"></div>
<div class="download-text">Google Play</div>
</a> </div>
</section>]

Process finished with exit code 0

 

 

6. 텍스트만 읽어오기

위에서 학습한 방법으로 어떤 식으로든 내가 원하는 부분을 뒤적거려서 긁어올 순 있는데, 앞 뒤로 태그가 덕지덕지 붙어 있어서 도무지 읽고 처리할 수 있는 형태가 아닐 수도 있다.

정작 내가 원하는 부분은 실제로 쓰여진 텍스트이기 때문에 그 부분만 추출하려면 .get_text()를 사용해야 한다.

import requests
from bs4 import BeautifulSoup
import re

webpage = requests.get("https://www.daangn.com/hot_articles")
soup = BeautifulSoup(webpage.content, "html.parser")

for x in range(0,10):
    print(soup.select(".card-title")[x].get_text())

class가 card-title인 것들만 리스트로 모아놓았었다. 거기서 텍스트를 뽑아보고 싶다면 이렇게 하면 되겠다. 앞에 10개만 출력해보자.

C:\Users\user\PycharmProjects\untitled4\venv\Scripts\python.exe C:/Users/user/PycharmProjects/untitled4/next.py
이케아 수납장(1세트 3쪽)
MOTTO 자전거 판매합니다
위닉스 제습기
휘센제습기
위닉스 제습기
위닉스 제습기 16리터 팝니다.
위닉스 뽀송 제습기 16L 판매합니다
밥솥 , 에어컨 3종, 런닝머신 , 전자레인지 , 화장실 온열기 , 바닥 밀대 팝니다 
캠핑의자
LG제습기 판매합니다

Process finished with exit code 0

 깔끔하게 출력된다!!

 

http://hleecaster.com/python-web-crawling-with-beautifulsoup/

 

파이썬 웹 크롤링 기초 (BeautifulSoup 사용 방법) - 아무튼 워라밸

본 포스팅에서는 파이썬으로 누구나(?) 따라할 수 있는 웹 크롤링 방법을 소개한다.

hleecaster.com

 

반응형