• 카테고리

    질문 & 답변
  • 세부 분야

    프로그래밍 언어

  • 해결 여부

    미해결

데코레이팅까지 해봤는데 안되네요;; 조언부탁드립니다.

20.04.19 13:24 작성 조회수 130

1

지난시간에 작동시간 연습했던게 생각이나서 해봤는데 아래와 같이 에러메세지가 나옵니다. 데코레이팅없이 그냥 단독실행하면 정상작동합니다. 실행시 2개 인자(start,end)를 전달했다고 생각했는데 뭐가 문제일까요? 조언 감사드립니다. 

아 그리고 평가 코멘트도 추출해보려했는데 공백과 /n/b/.. 같은 태그들이 같이 있어서 실패했습니다. 어떻게 할수 있나요? 오른쪽과 같이 시도했었습니다.  comments = i.select_one('td.title').text.strip() 

import requests
from bs4 import BeautifulSoup
import pandas
import time


def time_check(func):
def wrapper(*args,**kwargs):
start_time = time.time()
result = func(*args,**kwargs)
end_time = time.time() - start_time
print('{}함수 {}페이지에서 {}까지, 실행시간 {}'.format(func.__name__,args[0],args[1],end_time))
return result
return wrapper()

@time_check
def naver_movie(start, end):
lists = []

for p in range(start,end+1):
url = 'https://movie.naver.com/movie/point/af/list.nhn?&page={}'.format(p)
request = requests.get(url)
bs = BeautifulSoup(request.text,'lxml')

trs = bs.select('table.list_netizen > tbody > tr')

for i in trs:
ac_num = i.select_one('td.ac.num').text
title = i.select_one('td.title > a').text
score = i.select_one('td.title > div > em').text
# comments = i.select_one('td.title').text.strip()
writer = i.select_one('td.num > a').text
lists.append([ac_num,writer, title, score])
#print(ac_num, title, score, writer)

return lists


naver_movie(1,2)

C:\Python\venv\Scripts\python.exe C:/Python/venv/네이버평점.py

Traceback (most recent call last):

  File "C:/Python/venv/네이버평점.py", line 17, in <module>

    def naver_movie(start, end):

  File "C:/Python/venv/네이버평점.py", line 14, in time_check

    return wrapper()

  File "C:/Python/venv/네이버평점.py", line 10, in wrapper

    result = func(*args,**kwargs)

TypeError: naver_movie() missing 2 required positional arguments: 'start' and 'end'

Process finished with exit code 1

답변 1

답변을 작성해보세요.

1

return wrapper() 가 아니라 return wrapper 입니다. wrapper() 는 함수를 실행하는 문법이고 return wrapper 는 함수자체를 리턴하는 부분입니다.

댓글 부분은 말씀하신 코드로 했을때 문제 없이 동작합니다. 다만 원하는 형태로 나오지 않는다는 말씀을 하신것 같은데 이를 "실패" 라고 하지는 않습니다. 동작에는 문제가 없으니 그렇게 추출된 데이터에서 원하는 형태로 문자열을 다시 재가공해서 사용할 수 있는 내용으로 보여집니다.

comments = i.select_one('td.title').text.replace("\n", "").replace("신고", "").strip()

위의 예시처럼 엔터('\n') 값, 필요없는 문자열('신고') 같은 내용을 모두 빈문자열 ("") 로 치환해서 사용하실수도 있습니다.

도움이 되셨길 바랍니다.