본문 바로가기
코딩 연습/코딩배우기

파이썬 크롤링(Crawling) 연습 - BeautifulSoup 관련 함수

by good4me 2020. 10. 25.

goodthings4me.tistory.com

 

■ 파이썬 크롤링을 위해 알아야 하는 BeautifulSoup 관련 find(), find_all(), select() 등 함수 활용 예시

  • BeautifulSoup은 HTML, XML 등 파일에서 원하는 데이터를 파싱(Parsing)할 수 있는 라이브러리이다. 
  • BeautifulSoup는 매개변수로 전달받은 HTML 문자열(태그 요소와 내용 등의 소스 코드)을 BeautifulSoup 클래스 객체로 변환하여 원하는 정보를 추출할 수 있다.
  • 이 변환을 위해 html.parse, xlml 등의 구문 해석기(parser)를 이용한다.
  • type() 함수로 soup객체를 확인하면 BeautifulSoup 클래스 객체임을 확인할 수 있다.

 

아래의 html 소스를 test_html 변수에 저장하고, 이를 url로 가정한 상태에서 BeautifulSoup 관련 함수를 연습함

test_html = '''
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<title>HTML 크롤링 연습</title>
</head>
<h5><span classs="red">goodthings4me.tistory.com</span></h5>
<div id="ctest">
<p class="p1"><h3 class="h2c">파이썬 크롤링 연습을 위한 포스팅 내용</h3>
- BeautifulSoup 객체, find() 함수, select() 함수 등
</p>
<br>
<h3>국회 법제사법위원회, 대검찰청 국정감사 유튜브 영상</h3>
<ul id="s1">
<li class="course"><a href="https://youtu.be/fJlAzk8wkrM" target="_blank">책상 내려친 윤석열</a></li>
<li class="course"><a href="https://youtu.be/_pOicsZstGo" target="_blank">김봉현 2차 폭로에 충격! 대검 침묵</a></li>
<li class="course"><a href="https://youtu.be/AZbCWck7or0" target="_blank">속속 드러나는 검찰 의혹..김종민 "옵티 계좌추적도 안하고 덮었다</a></li>
<li class="course"><a href="https://youtu.be/kkfxzYaJhgI" target="_blank">김종민 가족수사 돌직구에 현타 온 윤석열</a></li>
<li class="course"><a href="https://youtu.be/bBJ2TLd7rD4" target="_blank">김종민 "대통령도 지휘권 인정" vs 윤석열 "검찰청법 위반</a></li>
</ul>
<h3>백지영, 독감, 커피, 송가인...</h3>
<ul id="s2">
<li class="course"><a href="https://youtu.be/GeUy9stf294" target="_blank">뉴스썰TV, 황희석....나 참 ! 별 x지 같은...</a></li>
<li class="course"><a href="https://youtu.be/U7_x-1vRrIA" target="_blank">아줌마가 사연이 많아서.. 한 곡만 부르고 갈게</a></li>
<li class="course"><a href="https://youtu.be/CgPFOrtb6cI" target="_blank">불안한 마음에 독감 예방 접종 '뚝'</a></li>
<li class="course"><a href="https://youtu.be/iyOOVX994vA" target="_blank">이런 사람은 커피(카페인) 안먹는 것이 좋습니다</a></li>
<li class="course"><a href="https://youtu.be/df9wgf_YdV0" target="_blank">송가인 오늘공연소식</a></li>
</ul>
<h3>나라장터 입찰, 로또가 아닙니다.</h3>
<div class="g2b">
<p class="g2b_content">2020년 G2BGO는 11,515건의 낙찰(1순위)을 예측해 냈습니다.<br>(공사업종 50개, 2020.01.01 ~ 08.31 G2BGO AI 입찰 결과 데이터)</p>
<p class="g2b_content">G2BGO의 자신감, 이제 여러분도 경험해 보세요!! <a class="g2b_link" href="http://g2bgo.co.kr" target="_blank" rel="noopener">https://www.g2bgo.kr</a></p>
</div>
<h5><span classs="green">goodthings4me.tistory.com</span></h5>
</body>
</html>
'''

good4me.co.kr

from bs4 import BeautifulSoup

soup = BeautifulSoup(test_html, 'html.parser')

print(type(soup))  
# <class 'bs4.BeautifulSoup'>  # BeautifulSoup 클래스 객체

 

soup 객체로 직접 HTML 요소나 속성에 접근하여 추출할 수 있음

print(soup.html['lang'])
# ko

print(soup.head)
'''
<head>
<meta charset="utf-8"/>
<title>HTML 크롤링 연습</title>
</head>
'''

print(soup.meta)
# <meta charset="utf-8"/>

print(soup.meta.name)
# meta

print(soup.meta['charset'])
# UTF-8

print(soup.title)
# <title>HTML 크롤링 연습</title>

print(soup.title.name)
# title

print(soup.title.string)
# HTML 크롤링 연습

print(soup.h3.string)  # soup.h3.text와 동일
# 파이썬 크롤링 연습을 위한 포스팅 내용

print(soup.p.contents)
# [<h3 class="h2c">파이썬 크롤링 연습을 위한 포스팅 내용</h3>, '\n- BeautifulSoup 객체, find() 함수, select() 함수 등\n']

print(soup.p.contents[0])
# <h3 class="h2c">파이썬 크롤링 연습을 위한 포스팅 내용</h3>

print(soup.h3.contents)
# ['파이썬 크롤링 연습을 위한 포스팅 내용']

print(soup.li['class'])  # 태그의 class 속성값 추출하기
# ['course']

print(soup.ul['id']) # 태그의 첫 번째 id 속성값
# s1

print(soup.div['id'])
# ctest

 

 

find()이용한 추출 - find()는 첫 번째 요소를 가져옴

find(tag, attributes, recursive, text, keywords)
find_all(tag, attributes, recursive, text, limit, keywords)

print(soup.find('p'))  # 첫 번째 P태그
'''
<p class="p1"><h3 class="h2c">파이썬 크롤링 연습을 위한 포스팅 내용</h3>
- BeautifulSoup 객체, find() 함수, select() 함수 등
</p>
'''

print(soup.find('div').name) # 태그의 이름
# div

print(soup.find('div')['id']) # 속성 추출, find('div')['class']도 가능
# ctest

print(soup.find('p')['class']) # class 속성은 리스트로 반환 
# ['p1']

print(soup.find('ul')['id']) 
# s1

print(soup.find('div', {'class':'g2b'}))
'''
<div class="g2b">
<p class="g2b_content">2020년 G2BGO는 11,515건의 낙찰(1순위)을 예측해 냈습니다.<br/>(공사업종 50개, 2020.01.01 ~ 08.31 G2BGO AI 입찰 결과 데이터)</p>
<p class="g2b_content">G2BGO의 자신감, 이제 여러분도 경험해 보세요!! <a class="g2b_link" href="http://g2bgo.co.kr" rel="noopener" target="_blank">https://www.g2bgo.kr</a></p>
</div>
'''

print(type(soup.find('div', {'class':'g2b'})))
# <class 'bs4.element.Tag'>

print(soup.find('div', {'class':'g2b'}).text)  # .get_text()도 동일한 기능
'''
2020년 G2BGO는 11,515건의 낙찰(1순위)을 예측해 냈습니다.(공사업종 50개, 2020.01.01 ~ 08.31 G2BGO AI 입찰 결과 데이터)
G2BGO의 자신감, 이제 여러분도 경험해 보세요!! https://www.g2bgo.kr
'''

print(soup.find('div', class_ = 'g2b').text)
'''
2020년 G2BGO는 11,515건의 낙찰(1순위)을 예측해 냈습니다.(공사업종 50개, 2020.01.01 ~ 08.31 G2BGO AI 입찰 결과 데이터)
G2BGO의 자신감, 이제 여러분도 경험해 보세요!! https://www.g2bgo.kr
'''

print(soup.find('a', class_ = 'g2b_link').get_text())
# https://www.g2bgo.kr

get_text()는 지정 태그를 포함한 모든 하위 태그를 제거하고 텍스트 문자열 반환(주의, 마지막 태그에 사용할 것)

 

print(soup.find('div', id = 'ctest').text)  # print(soup.find('div', {'id':'ctest'}).get_text())도 동일함

'''
파이썬 크롤링 연습을 위한 포스팅 내용
- BeautifulSoup 객체, find() 함수, select() 함수 등


국회 법제사법위원회, 대검찰청 국정감사 유튜브 영상

책상 내려친 윤석열
김봉현 2차 폭로에 충격! 대검 침묵
속속 드러나는 검찰 의혹..김종민 "옵티 계좌추적도 안하고 덮었다
김종민 가족수사 돌직구에 현타 온 윤석열
김종민 "대통령도 지휘권 인정" vs 윤석열 "검찰청법 위반

백지영, 독감, 커피, 송가인...

뉴스썰TV, 황희석....나 참 ! 별 x지 같은...
아줌마가 사연이 많아서.. 한 곡만 부르고 갈게
불안한 마음에 독감 예방 접종 '뚝'
이런 사람은 커피(카페인) 안먹는 것이 좋습니다
송가인 오늘공연소식

나라장터 입찰, 로또가 아닙니다.

2020년 G2BGO는 11,515건의 낙찰(1순위)을 예측해 냈습니다.(공사업종 50개, 2020.01.01 ~ 08.31 G2BGO AI 입찰 결과 데이터)
G2BGO의 자신감, 이제 여러분도 경험해 보세요!! https://www.g2bgo.kr

goodthings4me.tistory.com
'''


li_all = soup.find_all('li')
print(li_all)  # print(soup('li')) 과 동일함
'''
[<li class="course"><a href="https://youtu.be/fJlAzk8wkrM" target="_blank">책상 내려친 윤석열</a></li>, <li class="course"><a href="https://youtu.be/_pOicsZstGo" target="_blank">김봉현 2차 폭로에 충격! 대검 침묵</a></li>, <li class="course"><a href="https://youtu.be/AZbCWck7or0" target="_blank">속속 드러나는 검찰 의혹..김종민 "옵티 계좌추적도 안하고 덮었다</a></li>, <li class="course"><a href="https://youtu.be/kkfxzYaJhgI" target="_blank">김종민 가족수사 돌직구에 현타 온 윤석열</a></li>, <li class="course"><a href="https://youtu.be/bBJ2TLd7rD4" target="_blank">김종민 "대통령도 지휘권 인정" vs 윤석열 "검찰청법 위반</a></li>, <li class="course"><a href="https://youtu.be/GeUy9stf294" target="_blank">뉴스썰TV, 황희석....나 참 ! 별 x지 같은...</a></li>, <li class="course"><a href="https://youtu.be/U7_x-1vRrIA" target="_blank">아줌마가 사연이 많아서.. 한 곡만 부르고 갈게</a></li>, <li class="course"><a href="https://youtu.be/CgPFOrtb6cI" target="_blank">불안한 마음에 독감 예방 접종 '뚝'</a></li>, <li class="course"><a href="https://youtu.be/iyOOVX994vA" target="_blank">이런 사람은 커피(카페인) 안먹는 것이 좋습니다</a></li>, <li class="course"><a href="https://youtu.be/df9wgf_YdV0" target="_blank">송가인 오늘공연소식</a></li>]
'''

print(type(li_all))
# <class 'bs4.element.ResultSet'>

for li in li_all:
    print(li.a.text)  # li.text 도 동일
    print(li.a['href'])
'''
<class 'bs4.element.ResultSet'>
책상 내려친 윤석열
https://youtu.be/fJlAzk8wkrM
김봉현 2차 폭로에 충격! 대검 침묵
https://youtu.be/_pOicsZstGo
속속 드러나는 검찰 의혹..김종민 "옵티 계좌추적도 안하고 덮었다
https://youtu.be/AZbCWck7or0
김종민 가족수사 돌직구에 현타 온 윤석열
https://youtu.be/kkfxzYaJhgI
김종민 "대통령도 지휘권 인정" vs 윤석열 "검찰청법 위반
https://youtu.be/bBJ2TLd7rD4
뉴스썰TV, 황희석....나 참 ! 별 x지 같은...
https://youtu.be/GeUy9stf294
아줌마가 사연이 많아서.. 한 곡만 부르고 갈게
https://youtu.be/U7_x-1vRrIA
불안한 마음에 독감 예방 접종 '뚝'
https://youtu.be/CgPFOrtb6cI
이런 사람은 커피(카페인) 안먹는 것이 좋습니다
https://youtu.be/iyOOVX994vA
송가인 오늘공연소식
https://youtu.be/df9wgf_YdV0
'''

# limt=n 시, n개의 값 가져옴
print(soup.find_all('li', limit = 2))
'''
[<li class="course"><a href="https://youtu.be/fJlAzk8wkrM" target="_blank">책상 내려친 윤석열</a></li>, <li class="course"><a href="https://youtu.be/_pOicsZstGo" target="_blank">김봉현 2차 폭로에 충격! 대검 침묵</a></li>]
'''


# 태그와 클래스 속성값으로 추출
print(soup.find_all('a', 'g2b_link'))
# [<a class="g2b_link" href="http://g2bgo.co.kr" rel="noopener" target="_blank">https://www.g2bgo.kr</a>]


print(soup.find_all({'h3', 'h5'})) # 모든 h3, h5 태그 반환
'''
[<h5><span classs="red">goodthings4me.tistory.com</span></h5>, <h3 class="h2c">파이썬 크롤링 연습을 위한 포스팅 내용</h3>, <h3>국회 법제사법위원회, 대검찰청 국정감사 유튜브 영상</h3>, <h3>백지영, 독감, 커피, 송가인...</h3>, <h3>나라장터 입찰, 로또가 아닙니다.</h3>, <h5><span classs="green">goodthings4me.tistory.com</span></h5>]
'''

# 지정된 속성의 태그를 모두 반환
print(soup.find_all({'span':{'class':{'red','green'}}})) 
# [<span classs="red">goodthings4me.tistory.com</span>, <span classs="green">goodthings4me.tistory.com</span>]

 

 

select()는 리스트를 반환함

html = soup.select('#ctest')
print(html)
'''
[<div id="ctest">
<p class="p1"><h3 class="h2c">파이썬 크롤링 연습을 위한 포스팅 내용</h3>
- BeautifulSoup 객체, find() 함수, select() 함수 등
</p>
<br/>
<h3>국회 법제사법위원회, 대검찰청 국정감사 유튜브 영상</h3>
<ul id="s1">
<li class="course"><a href="https://youtu.be/fJlAzk8wkrM" target="_blank">책상 내려친 윤석열</a></li>
<li class="course"><a href="https://youtu.be/_pOicsZstGo" target="_blank">김봉현 2차 폭로에 충격! 대검 침묵</a></li>
<li class="course"><a href="https://youtu.be/AZbCWck7or0" target="_blank">속속 드러나는 검찰 의혹..김종민 "옵티 계좌추적도 안하고 덮었다</a></li>
<li class="course"><a href="https://youtu.be/kkfxzYaJhgI" target="_blank">김종민 가족수사 돌직구에 현타 온 윤석열</a></li>
<li class="course"><a href="https://youtu.be/bBJ2TLd7rD4" target="_blank">김종민 "대통령도 지휘권 인정" vs 윤석열 "검찰청법 위반</a></li>
</ul>
<h3>백지영, 독감, 커피, 송가인...</h3>
<ul id="s2">
<li class="course"><a href="https://youtu.be/GeUy9stf294" target="_blank">뉴스썰TV, 황희석....나 참 ! 별 x지 같은...</a></li>
<li class="course"><a href="https://youtu.be/U7_x-1vRrIA" target="_blank">아줌마가 사연이 많아서.. 한 곡만 부르고 갈게</a></li>
<li class="course"><a href="https://youtu.be/CgPFOrtb6cI" target="_blank">불안한 마음에 독감 예방 접종 '뚝'</a></li>
<li class="course"><a href="https://youtu.be/iyOOVX994vA" target="_blank">이런 사람은 커피(카페인) 안먹는 것이 좋습니다</a></li>
<li class="course"><a href="https://youtu.be/df9wgf_YdV0" target="_blank">송가인 오늘공연소식</a></li>
</ul>
<h3>나라장터 입찰, 로또가 아닙니다.</h3>
<div class="g2b">
<p class="g2b_content">2020년 G2BGO는 11,515건의 낙찰(1순위)을 예측해 냈습니다.<br/>(공사업종 50개, 2020.01.01 ~ 08.31 G2BGO AI 입찰 결과 데이터)</p>
<p class="g2b_content">G2BGO의 자신감, 이제 여러분도 경험해 보세요!! <a class="g2b_link" href="http://g2bgo.co.kr" rel="noopener" target="_blank">https://www.g2bgo.kr</a></p>
</div>
<h5><span classs="green">goodthings4me.tistory.com</span></h5>
</div>]
'''

print(type(html))
# <class 'list'>

print(soup.select('p[class="g2b_content"]'))
'''
[<p class="g2b_content">2020년 G2BGO는 11,515건의 낙찰(1순위)을 예측해 냈습니다.<br/>(공사업종 50개, 2020.01.01 ~ 08.31 G2BGO AI 입찰 결과 데이터)</p>, <p class="g2b_content">G2BGO의 자신감, 이제 여러분도 경험해 보세요!! <a class="g2b_link" href="http://g2bgo.co.kr" rel="noopener" target="_blank">https://www.g2bgo.kr</a></p>]
'''

 

 

댓글