본문 바로가기
● 크롤링, 자동화/BeautifulSoup

[나도코딩] 파이썬 코딩 무료 강의 (활용편3) - 웹 크롤링? 웹 스크래핑! 3 : attrs, find, class, sibling, siblings

by 0ver-grow 2020. 8. 28.
반응형

10. 웹툰 크롤링 : attrs, find, class 

!pip install beautifulsoup4
# 구글 분석 파서
!pip install lxml
import requests
from bs4 import BeautifulSoup

url = "https://comic.naver.com/webtoon/weekday.nhn"
res = requests.get(url)
res.raise_for_status()
# 가져온 html문서(res.text)를 lxml파서를 통해 BS객체를 만든 것
soup = BeautifulSoup(res.text, "lxml")
print(soup.title)
print(soup.title.get_text()) # 태그뺴고 텍스트만

출력 결과

<title>네이버 만화 &gt; 요일별 웹툰 &gt; 전체웹툰</title>

네이버 만화 > 요일별 웹툰 > 전체웹툰

 

print(soup.a) # html태그 중 가장 상위에 있는 a태그만 출력

<a href="#menu" onclick="document.getElementById('menu').tabIndex=-1;document.getElementById('menu').focus();return false;"><span>메인 메뉴로 바로가기</span></a>

print(soup.a.attrs) # a태그의 속성 정보

{'href': '#menu', 'onclick': "document.getElementById('menu').tabIndex=-1;document.getElementById('menu').focus();return false;"}

#a태그의 href태그의 value정보 출력
print(soup.a["href"])

#menu

# soup객체에서 a태그에 해당되는 첫번쨰 a태그 중에서 
# class명이 Nbtn_upload 를 찾자
print(soup.find("a",attrs={"class":"Nbtn_upload"}))

<a class="Nbtn_upload" href="/mypage/myActivity.nhn" onclick="nclk_v2(event,'olk.upload');">웹툰 올리기</a>

# 이 페이지에 웹툰 올리기는 하나뿐이므로 class : Nbtn_upload만으로 찾을 수 있다.
print(soup.find(attrs={"class":"Nbtn_upload"}))

<a class="Nbtn_upload" href="/mypage/myActivity.nhn" onclick="nclk_v2(event,'olk.upload');">웹툰 올리기</a>

# "class":"rank01"를 찾아보자 
print(soup.find(attrs={"class":"rank01"}))

# "class":"rank01"에서 a엘리먼트만 출력해보자
rank01 = soup.find(attrs={"class":"rank01"})
print(rank01.a)

<a href="/webtoon/detail.nhn?titleId=641253&amp;no=302" onclick="nclk_v2(event,'rnk*p.cont','641253','1')" title="외모지상주의-302화 김기명 [01]">외모지상주의-302화 김기명 [01]</a>

 

11. 웹툰 크롤링 : 

다음 형제 엘리먼트로 넘어가기

rank01의 다음 형제 엘리먼트인 rank02로 넘어가보자

print(rank01.next_sibling)

출력물이 공백이다.

왜일까?

줄바꿈이 있는 경우에 공백으로 출력된다.

이럴때는 next_sibling을 두 번 입력해야 형제 엘리먼트인 rank02 가 출력된다.

print(rank01.next_sibling.next_sibling)

rank03의 텍스트만 출력시켜보자

rank02 = rank01.next_sibling.next_sibling
rank03 = rank02.next_sibling.next_sibling
print(rank03.a.get_text())

갓 오브 하이스쿨-477화

 

이전 형제 엘리먼트로 넘어가기

이번에는 rank03의 이전 형제 엘리먼트인 rank02로 넘어가보자

rank02 = rank03.previous_sibling.previous_sibling
print(rank02.a.get_text())

재혼 황후-45화


다음 형제 엘리먼트로 바로 넘어가기

이전에는 줄바꿈이 있는 경우 next_sibling을 두번 썼다.

하지만 다음 코드를 쓰면 한번에 출력할 수 있다.

# 이전에는 줄바꿈이 있는 경우 next_sibling을 두번 썼다.
# 하지만 다음 코드를 쓰면 한번에 출력할 수 있다.
rank03 = rank02.find_next_sibling("li")
print(rank03.a.get_text())

갓 오브 하이스쿨-477화

 

 

모든 형제 엘리먼트 출력하기

rank_all = rank01.find_next_siblings("li")
print(rank_all)

단, 리스트형태로 출력되기 때문에 텍스트(str)만 뽑아주는 get_text()를 쓸수 없다.

리스트형태를 str형태로 변환한 뒤에 get_text()를 써야한다.


부모 엘리먼트로 출력하기

print(rank01.parent)

 

<ol class="asideBoxRank" id="realTimeRankFavorite">

   <li>

...

   </li>

</ol>

 


class, id가 아닌 text의 내용으로 찾아보자

text가 화장 지워주는 남자-118화 인것을 찾자.

webtoon = soup.find("a", text="화장 지워주는 남자-118화")
print(webtoon)

<a href="/webtoon/detail.nhn?titleId=710754&amp;no=118" onclick="nclk_v2(event,'rnk*p.cont','710754','9')" title="화장 지워주는 남자-118화">화장 지워주는 남자-118화</a>

반응형