오늘은 지난번에 정리한 기초 뼈대 코드 다음으로 중요한, select / select_one을 정리해 보려고 한다. 기초 코드를 통해서 해당 웹 페이지의 html 코드를 가져왔다면, 그다음으로 해야 할 일은 원하는 class나 id를 가진 태그를 찾아 해당 부분만 정확하게 타겟팅하여 추출하는 일이다.
보통 html 코드를 전체 가져오게 되면, 위와 같은 부분에서 코드가 끝난다.
req = requests.get(search_url, headers = headers, cookies = cookie)
html = req.text
soup = BeautifulSoup(html, "html.parser")
그러면 이제 soup 내에서 class나 id를 선택해서 원하는 부분을 추출하면 되는데, 이때 쓰이는 메서드가 select, select_one이다.
01. Select
예를 들어서, 멜론 차트를 보면 1위부터 50위까지는 "lst50" 이라는 CLASS 이름을 사용하고 있다.
html에서 얼마나 사용되었는지를 검색해보면 50번 사용되었다.
이때 select를 사용하면 해당 클래스를 사용하는 부분을 모두 선택할 수 있다. 한편 select는 class를 모두 가져오기 때문에, 그 안에서 하나씩 정보를 추출하기 위해서는 iteration을 돌면서 select_one을 사용해야 한다.
select의 결과물은 리스트 형태로 되어 있고, 예를 들어서 첫 번째 값인 [0] 번째 값을 찍어보면 아래와 같은 html 코드가 나온다.
<tr class="lst50" data-song-no="36430773" id="lst50">
<td><div class="wrap t_right"><input class="input_check" name="input_check" title="퀸카 (Queencard) 곡 선택" type="checkbox" value="36430773"/></div></td>
<td><div class="wrap t_center"><span class="rank">1</span><span class="none">위</span></div></td>
<!-- 차트순위 추가 -->
<td><div class="wrap">
<span class="rank_wrap" title="순위 동일">
<span class="bullet_icons rank_static"><span class="none">순위 동일</span></span>
<span class="none">0</span>
</span>
</div></td>
<td><div class="wrap">
<a class="image_typeAll" href="javascript:melon.link.goAlbumDetail('11240232');" title="I feel">
<img alt="I feel - 페이지 이동" height="60" onerror="WEBPOCIMG.defaultAlbumImg(this);" src="https://cdnimg.melon.co.kr/cm2/album/images/112/40/232/11240232_20230509151820_500.jpg/melon/resize/120/quality/80/optimize" width="60">
<span class="bg_album_frame"></span>
</img></a>
</div></td>
<td><div class="wrap">
<a class="btn button_icons type03 song_info" href="javascript:melon.link.goSongDetail('36430773');" title="퀸카 (Queencard) 곡정보"><span class="none">곡정보</span></a>
</div></td>
<td><div class="wrap">
<div class="wrap_song_info">
<div class="ellipsis rank01"><span>
<a href="javascript:melon.play.playSong('1000002721',36430773);" title="퀸카 (Queencard) 재생">퀸카 (Queencard)</a>
</span></div><br/>
<div class="ellipsis rank02">
<a href="javascript:melon.link.goArtistDetail('2137482');" title="(여자)아이들 - 페이지 이동">(여자)아이들</a><span class="checkEllipsis" style="display:none"><a href="javascript:melon.link.goArtistDetail('2137482');" title="(여자)아이들 - 페이지 이동">(여자)아이들</a></span>
</div>
</div>
</div></td>
<td><div class="wrap t_center">
<button class="button_icons scrap" onclick="melon.play.addPlayList('36430773');" title="담기" type="button"><span class="none">담기</span></button>
</div></td>
<td><div class="wrap t_center">
<button class="button_icons download" onclick="melon.buy.goBuyProduct('frm', '36430773', '3C0001', '','0', '1000002721');" title="다운로드" type="button"><span class="none">다운로드</span></button>
</div></td>
<td><div class="wrap t_center">
<button class="button_icons video" onclick="melon.link.goMvDetail('1000002721', '36430773','song');" title="뮤직비디오" type="button"><span class="none">뮤직비디오</span></button>
</div></td>
</tr>
자세히 보면 중간에 ellipsis rank01이라는 class 안에 노래 제목이 있고, ellipsis rank02라는 class 안에 가수 이름이 있다. 이제 iteration을 돌면서 하나만 select 하는 select_one을 사용해 주면 된다.
select_one
iteration을 사용한 selet_one 코드는 아래와 같다.
my_list = soup.select(".lst50")
for rank, lst in enumerate(my_list, 1):
title = lst.select_one(".ellipsis.rank01 a").text
print(f"{rank}위: {title}")
우선 select_one을 사용하는 방법을 이해할 필요가 있다.
1) select_one(".클래스명") = 해당하는 클래스명을 가져온다.
2) 여러 개의 클래스를 가지고 있는 태그를 가져올 때에는, ".클래스명A.클래스명B" 이런 식으로 두 개의 클래스명을 붙여서 사용한다.
3) 하위 태그를 가져올 때는 ".클래스명 하위태그" 이렇게 사용하면 된다.
<div class="ellipsis rank01">
<span>
<a href="javascript:melon.play.playSong('1000002721',36430773);"
title="퀸카 (Queencard) 재생">퀸카 (Queencard)</a>
</span>
</div>
위 코드를 보면, DIV 태그 안에 a 태그에서 타이틀을 가지고 있기 때문에 그렇게 접근하였다.
마지막으로 .text를 사용하여 text를 추출해 내면 끝!
10위에서 break를 걸고 추출해 보면 위와 같다.
여기까지가 간단한 select, select_one 사용법이다.
다음에는 실제로 뉴스 같은 걸 크롤링해보면서 정리를 해야겠다.
끝.
'Python 스크래핑' 카테고리의 다른 글
파이썬 크롤링 BeautifulSoup 정리 (1) - 코드 기초 뼈대 (0) | 2023.06.20 |
---|