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>네이버 만화 > 요일별 웹툰 > 전체웹툰</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&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&no=118" onclick="nclk_v2(event,'rnk*p.cont','710754','9')" title="화장 지워주는 남자-118화">화장 지워주는 남자-118화</a>
'● 크롤링, 자동화 > BeautifulSoup' 카테고리의 다른 글
[잔재미코딩] [복습] naver datalab (0) | 2021.02.01 |
---|---|
[나도코딩] 파이썬 코딩 무료 강의 (활용편3) - 웹 크롤링? 웹 스크래핑! 4. find_all, for 문 (0) | 2020.08.29 |
[나도코딩] 파이썬 코딩 무료 강의 (활용편3) - 웹 크롤링? 웹 스크래핑! 2 : User Agent (0) | 2020.08.27 |
[나도코딩] 파이썬 코딩 무료 강의 (활용편3) - 웹 크롤링? 웹 스크래핑! 1 : HTML, X-Path, Request, re(정규식) (0) | 2020.08.26 |
[잔재미코딩] 7. 한빛미디어 페이지 실전 크롤링 쿠키와 세션 찾기 (0) | 2020.03.12 |