조금씩 꾸준히 완성을 향해

[Python] BeautifulSoup 기본 사용법 정리 본문

Python/Web Scraping

[Python] BeautifulSoup 기본 사용법 정리

all_sound 2022. 9. 14. 21:13

BeautifulSoup에 대한 기본적인 사용법을 정리해 보겠다.

 

 

▶ 기본 셋팅

#라이브러리 import
import requests
from bs4 import BeautifulSoup

# 네이버 웹툰 url 
url = "https://comic.naver.com/index"
res = requests.get(url)
res.raise_for_status()
# html 문서를 가져와서 lxml parser 혹은 html parser를 통해서 soup 객체로 생성
soup = BeautifulSoup(res.text, 'lxml')
soup = BeautifulSoup(res.text, 'html.parser')

 

 

▶ 태그명 바로 가져오기

print(soup.title.get_text())  # title 태그의 text만 가져옴
#결과: '네이버 웹툰'

print(soup.a)  # soup 객체에서 처음 발견되는 a element 출력
#결과: <a href="#menu" onclick="document.getElementById('menu').tabIndex=-1;document.getElementById('menu').focus();return false;"><span>메인 메뉴로 바로가기</span></a>

print(soup.a.attrs)  # a element의 속성정보를 출력
#결과: {'href': '#menu', 'onclick': "document.getElementById('menu').tabIndex=-1;document.getElementById('menu').focus();return false;"}

print(soup.a["href"])  # a element의 href 속성 '값' 정보를 출력
#결과: '#menu'

 

 

 find 함수로 찾기 

 

이름, 속성, 속성값을 특정하여 태그를 찾을 수 있다.

# class name이 'Nbtn_upload'인 a element 출력(처음으로 발견되는)
print(soup.find('a', attrs={'class': 'Nbtn_upload'}))
print(soup.find('a', 'Nbtn_upload')) #기본적으로 두번째 파라미터는 class로 세팅된다
#결과: <a class="Nbtn_upload" href="/mypage/myActivity" onclick="nclk_v2(event,'olk.upload');">웹툰 올리기</a>

# class name이 'Nbtn_upload'인 어떤 element 출력(처음으로 발견되는)
print(soup.find(attrs={'class': 'Nbtn_upload'}))
#결과: <a class="Nbtn_upload" href="/mypage/myActivity" onclick="nclk_v2(event,'olk.upload');">웹툰 올리기</a>
#class name이 'tit'인 모든 element들 찾기
all_tit = soup.find_all(attrs={'class': 'tit'}) 
for tit in all_tit:
    print(tit)

''' 결과:
<a class="tit" href="/webtoon/detail?titleId=747269&amp;no=120" id="recommand_titleName_0" title="전지적 독자 시점">전지적 독자 시점</a>
<a class="tit" href="/webtoon/detail?titleId=750184&amp;no=111" id="recommand_titleName_1" title="나쁜사람">나쁜사람</a>
<a class="tit" href="/webtoon/detail?titleId=738694&amp;no=125" id="recommand_titleName_2" title="튜토리얼 탑의 고인물">튜토리얼 탑의 고인물</a>
<a class="tit" href="/webtoon/detail?titleId=717481&amp;no=207" id="recommand_titleName_3" title="일렉시드">일렉시드</a>
<a class="tit" href="/webtoon/detail?titleId=667573&amp;no=344" id="recommand_titleName_4" title="연놈">연놈</a>
'''

 

 

  ※ tag object 확인 

object_tag = soup.find('a')

#태그의 이름
object_tag.name
#결과: 'a'

#태그에 담긴 텍스트
object_tag.text
#결과: '웹툰 올리기'

#태그의 속성과 속성값
object_tag.attrs
#결과: {'href': '/mypage/myActivity', 'class': ['Nbtn_upload'], 'onclick': "nclk_v2(event,'olk.upload');"}

 

select 함수 

 

select는 CSS selector로 tag 객체를 찾아 반환한다. find처럼 태그 이름, 속성, 속성값을 특정하는 방식은 같으나 그 이외에도 다양한 선택자(selector)를 갖기 때문에 여러 요소를 조합하여 태그를 특정하기 쉽다.

# 태그 이름만 특정
soup.select_one('a')

# 태그 class 특정
soup.select_one('.Nbtn_upload')

# 태그 이름과 class 모두 특정
soup.select_one('a.Nbtn_upload')

# 태그 id 특정
soup.select_one('#updateCompositionContent')

# 태그 이름과 id 모두 특정
soup.select_one('div#updateCompositionContent')

# 태그 이름과 class, id 모두 특정
soup.select_one('div.genreRecomBox_area#updateCompositionContent')
#find vs select
soup.find('div').find('p')
soup.select_one('div > p')

 예를 들어 특정 경로의 태그를 반환하고 싶을 때, find의 경우 반복적으로 코드를 덧붙여야 한다. select는 직접 하위 경로를 지정할 수 있기 때문에 간편하다.