소소한 컴퓨터 이야기

HTML 태그 탐색하기

by Cori

HTML 태그를 살펴보는 방법 (부모 태그, 자식 태그 등)에 대해 다룬다.

 

* 해당 포스팅에서 다루고 있는 모든 내용은 다음 서적을 참고하였습니다.

 

직장인을 위한 데이터 분석 실무 with 파이썬(개정판)(위키북스 데이터 사이언스 시리즈 63)

‘데이터 분석은 좋은 질문에서 시작합니다’이 책에서는 누구나 궁금했던 그 질문에 대해 데이터로 답해 봅니다. 이 책은 파이썬을 처음 접하는 마케팅, 영업, 기획 실무 담당자들이 파이썬을

book.naver.com


1. 크롤링 대상 탐색하기 

1) 태그를 출력해 보았을 때, 원하는 개수만큼 들어있는 경우

genie 사이트의 HTML 정보

F12키를 누르면 위 그림과 같이 브라우저에서 HTML 소스를 확인할 수 있다. 태그를 한 단계씩 살피다보면 

노래 한 곡의 정보를 가지는 태그를 찾을 수 있는데, 태그를 살펴보며 원하는 정보를 찾을 수 있어야 한다. 

title 정보를 담고 있는 태그를 알 수 있음

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 음원 사이트의 경우 한 페이지에 100개의 음원정보가 들어있음

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])

1위 노래에 대한 정보가 담겼다.

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

노래 정보는 태그명이 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

활동하기