220301 화
[오늘 할일]
# 파이썬 크롤링으로 네이버 영화 랭크, 타이틀, 평점가져오기 Quiz 끝내기
[오늘 공부한 것]
▼ 파이썬에서 print 를 할때 아래와 같이 실행할때 아래와 같이 movie_rank 가 자꾸 defined 되지 않았다고 한다.
도대체 왜??? 봤더니, print 할때 if 절 밖에서 하다 보니, if 절 안에서 선언한 변수가 적용되지 않았던 것이다.
if 절 안의 변수를 print 하려면, print 가 if 절 안에 들어와 있어야 한다.
=========== 에러 메시지 ==========
Traceback (most recent call last):
File "C:\Users\sukin\Desktop\sparta\pythonprac\hello.py", line 28, in <module>
print(movie_rank, movie_title, movie_point)
NameError: name 'movie_rank' is not defined
=========== 에러가 나온 스크립트 ==========
import requests
from bs4 import BeautifulSoup
headers = {'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36'}
data = requests.get('https://movie.naver.com/movie/sdb/rank/rmovie.naver?sel=pnt&date=20210829',headers=headers)
soup = BeautifulSoup(data.text, 'html.parser')
title = soup.select_one('#old_content > table > tbody > tr:nth-child(2) > td.title > div > a')
print(title['href'])
# #old_content > table > tbody > tr:nth-child(3) > td.title > div > a
# # old_content > table > tbody > tr:nth-child(4) > td.title > div > a
# select 된 여러줄을 보면, #old_content > table > tbody > tr 태그 까지가 공통임.
movies = soup.select('#old_content > table > tbody > tr')
# print(movies)
# 한줄씩 for 문을 돌려, 제목 (text) 를 text 메서드로 출력해보기
for movie in movies:
a = movie.select_one('td.title > div > a')
b = movie.select_one('td > img')
c = movie.select_one('td.point')
if a != None:
movie_title = a.text
movie_rank = b['alt']
movie_point = c.text
print(movie_rank, movie_title, movie_point) => 이렇게 하면 문제 발생 됨
print(movie_rank, movie_title, movie_point) => 이렇게 하면 if 절 안에 들어와서 적용 됨.
▼ 파이썬 beautifulsoup select 는 여러 태그를 한번에 보여주고, select_one 은 하나의 태그를 보여준다고 하였다.
내가 보여줄려고 하는 건, 아래와 같다.
아래는 네이버화면이다. https://movie.naver.com/movie/sdb/rank/rmovie.naver?sel=pnt&date=20210829
1번의 랭킹은 아래의 태그다.
#old_content > table > tbody > tr:nth-child(2) > td:nth-child(1) > img
2번의 타이틀은 아래의 태그다.
#old_content > table > tbody > tr:nth-child(2) > td.title > div > a
3번의 평점은 아래의 태그 정보에 있다.
#old_content > table > tbody > tr:nth-child(2) > td.point
1번, 2번, 3번의 공통된 부분은, 아래의 태그이고, select 로 다중선택으로 가져온다.
#old_content > table > tbody > tr
그리고 for 문으로, select 된 태그를 하나씩 순회하며 가져오도록 한다.
이후에 하나씩 순회하는 얘들을, select_one 으로 하나씩 선택해서, 소스가 될 변수로 넣어주고,
최종적으로 들어갈 랭킹, 타이틀, 평점을 소스가 된 변수로 부터 메서드로 다시 발라준다.
여기서 중요한게, 텍스트는 .text 메서드로 텍스트만 가져올 수 있고,
태그안에 속성 값들은, 리스트 인덱스 처럼, 해당 속성을 인덱스 값으로 해서 선택해서 불러온다.
이후에 제목이 없는 녀석들은 if 문으로 None 이 아닌 얘들로 걸러준다.
movies = soup.select('#old_content > table > tbody > tr')
# 한줄씩 for 문을 돌려, 랭킹, 제목 (text), 평점 하나씩 가져오기
for movie in movies:
a = movie.select_one('td.title > div > a')
b = movie.select_one('td > img')
c = movie.select_one('td.point')
if a != None:
movie_title = a.text
movie_rank = b['alt'] #이미지 태그 안에서 alt 속성인데, 값을 보려면 alt 를 인덱스로 해서 불러온다.
movie_point = c.text
print(movie_rank, movie_title, movie_point)
▼ 아래와 같이, select_one 에서 바로 메서드 .text 나 속성을 찾는 인덱싱 ['alt'] 을 쓸수도 있다.
다만 아래와 같이 하니깐 자꾸 에러가 나던데..
for movie in movies:
a = movie.select_one('td.title > div > a').text
b = movie.select_one('td > img')['alt']
c = movie.select_one('td.point').text
if a != None:
movie_title = a
movie_rank = b
movie_point = c
print(movie_rank, movie_title, movie_point)
====== 에러 메시지 ==========
Traceback (most recent call last):
File "C:\Users\sukin\Desktop\sparta\pythonprac\hello.py", line 20, in <module>
a = movie.select_one('td.title > div > a').text
AttributeError: 'NoneType' object has no attribute 'text'
=======================
'NoneType' object has no attribute 에러는 해당 값에 값이 없기 때문에 메서드가 작용하지 않는다는 것이다.
for movie in movies 에서, 실쩨로 첫번째가 값이 None 이였다. None 값에 메서드를 적용하려하니 당연히 안되던 것.
그래서 if 로 None 이 아닌 것들을 대상으로 메서드를 적용하도록 순서조정이 필요하다. 아래 처럼..
for movie in movies:
a = movie.select_one('td.title > div > a')
if a != None: # None 값을 걸러주고, None 이 아닌 값들을 대상을 메서드를 적용하도록 함. 이러면 에러없음
movie_title = a.text
movie_rank = movie.select_one('td > img')['alt']
movie_point = movie.select_one('td.point').text
print(movie_rank, movie_title, movie_point)
AttributeError: 'NoneType' object has no attribute 'find' 에러 해결 방법
안녕하세요 이번 포스팅에서는 파이썬 수행 시 발생할 수 있는 오류 중에 하나인 "AttributeError: 'NoneType' object has no attribute 'find'"에 대해서 설명드리겠습니다. 쉬운 이해를 돕기 위해서 예제를 통
davey.tistory.com