HTML 태그 탐색하기
by CoriHTML 태그를 살펴보는 방법 (부모 태그, 자식 태그 등)에 대해 다룬다.
* 해당 포스팅에서 다루고 있는 모든 내용은 다음 서적을 참고하였습니다.
직장인을 위한 데이터 분석 실무 with 파이썬(개정판)(위키북스 데이터 사이언스 시리즈 63)
‘데이터 분석은 좋은 질문에서 시작합니다’이 책에서는 누구나 궁금했던 그 질문에 대해 데이터로 답해 봅니다. 이 책은 파이썬을 처음 접하는 마케팅, 영업, 기획 실무 담당자들이 파이썬을
book.naver.com
1. 크롤링 대상 탐색하기
1) 태그를 출력해 보았을 때, 원하는 개수만큼 들어있는 경우

F12키를 누르면 위 그림과 같이 브라우저에서 HTML 소스를 확인할 수 있다. 태그를 한 단계씩 살피다보면
노래 한 곡의 정보를 가지는 태그를 찾을 수 있는데, 태그를 살펴보며 원하는 정보를 찾을 수 있어야 한다.

songs = soup.select('tbody > tr') # 50개 노래 저장 song = songs[0] title = song.select('a.title') print(len(title)) # 1 # 1이 나왔다면, 만족하지 말고 곡 제목 태그를 제대로 가지고 왔는지 확인해보자 -> text 이용 title = song.select('a.title')[0].text print(title)

# title에 공백 문자와 줄 바꿈 기호가 같이 포함되어 있으므로, 이를 제거 -> strip() 이용 title = song.select('a.title')[0].text.strip() print(title)

2) 태그를 출력해 보았을 때, 원하는 개수가 들어있지 않은 경우

Bugs에는 tr 태그 안에 노래 제목, 가수 정보가 포함되어 있다. tr 태그를 살펴보자.
# 모든 tr 태그의 정보 탐색 songs = soup.select('tr') print(len(songs)) # 104 # 길이를 출력해 보았더니, 104개가 나옴 -> 상위 tbody 태그 추가하여 선택 songs = soup.select('tbody > tr') print(len(songs)) # 103 # 길이를 출력해 보았더니, 103개가 나옴 -> 상위 table 태그 추가하여 선택 songs = soup.select('table > tbody > tr') print(len(songs)) # 103 # table 태그에 있는 byChart라는 클래스 이름 지정하여 선택 songs = soup.select('table.byChart > tbody > tr') print(len(sogns)) # 100
테이블의 클래스 이름을 지정하여 선택하였더니, 우리가 원하는 100개의 음원 정보를 선택할 수 있었다.
# 제대로 선택한지 확인 print(songs[0])

노래 정보를 포함하는 태그를 제대로 찾았기 때문에, 이 태그를 이용해 노래 제목과 가수명을 추출해보자.

노래 정보는 태그명이 p 이면서, class 이름이 title인 태그 안의 a 태그에 들어있다
# a 태그를 song 태그 안에서 찾아보자 title = song.select('a') print(len(title)) # 11 # 상위 태그로 p 태그를 지정해 검색 조건을 추가하자 title = song.select('p > a') print(len(title)) # 2 # p 태그 아래에 존재하는 a 태그를 모두 찾았지만 2개가 나오기 때문에, 클래스 이름을 지정하자 title = song.select('p.title > a') print(len(title)) # 1
태그의 클래스 이름까지 지정하여 검색하였더니, 우리가 원하는 1개의 title 정보를 찾을 수 있었다.
# 제대로 선택한지 확인 title = song.select('p.title > a')[0].text print(title)

가수 이름도 위와 같은 과정을 통해 제대로 선택할 수 있다.
1~100위 정보 또한 추출해보자
# 반복문을 활용한 1위에서 100위까지 정보 추출 songs = soup.select('table.byChart > tbody > tr') for song in songs: title = song.select('p.title > a')[0].text singer = song.select('p.artist > a')[0].text print(title, singer, sep = '|')

블로그의 정보
코딩하는 오리
Cori