작성
·
545
1
답변 3
1
코드를 보니 어떤 질문을 하셨는지 이해했습니다.
보면 content = tr.find("td", {"class", "title"}).text 로 내용을 모두 구해오셨는데 이 안에 모든 정보가 들어가 있고 text 는 str 형태기 때문에 여기서 제목, 별점을 분리하려면 문자열 파싱을 해야 합니다. 문자열 파싱이란 말 그대로 문자열에서 내가 원하는 데이터를 뽑아내는 걸 일컫는데 str 의 find 함수 같은걸 사용해서 이리저리 인덱싱을 해야하는데 좀 귀찮죠.
그래서 문자열 파싱보다는 위의 tr.find("td", {"class", "title"}) 까지만 하면 해당 결과는 BeautifulSoup 형태가 되니까 여기서부터 하위 태그를 하나 하나 find 하여서 직접 접근하는데 훨씬 편합니다. 일단 find 함수를 사용하셨기에 저도 find 함수를 써서 코드를 짜보긴 했습니다만 보통 select, select_one 함수를 쓰는게 훨씬 더 편합니다.
어쨌든 길게 설명하는것보다 코드를 보는게 훨씬 더 이해하기 좋을테니 코드를 한번 짜봤습니다.
import requests
from bs4 import BeautifulSoup
#select는 만족하는 여러 인스턴스를 찾고, find는 첫 번째 인스턴스를 반환합니다.
def get_movie_point(start, end):
result = []
for i in range(start, end+1):
url = 'https://movie.naver.com/movie/point/af/list.nhn?&page={}'.format(i)
r = requests.get(url)
bs = BeautifulSoup(r.text, "lxml")
trs = bs.select("table.list_netizen > tbody > tr")
for tr in trs: #다수의 평점
# td 의 title 클래스를 구합니다.
tr_data = tr.find("td", {"class", "title"})
# td class="title" 자식중 최초 a 태그안에 제목만 추출
title = tr_data.find("a").text
# td class="title" 자식중 div 태그 자식중 em 태그에 점수 추출
score = tr_data.find("div", {"class", "list_netizen_score"}).find("em").text
# td class="title" 태그에서 a, div, br 태그 제거
# a를 두번하는 이유는 find() 함수는 1개만 리턴되기 때문에
# 2개의 a 태그를 삭제하기 위해서
# extract() 함수는 태그와 태그의 내용까지 모두 제거합니다.
tr_data.find("a").extract()
tr_data.find("a").extract()
tr_data.find("div").extract()
tr_data.find("br").extract()
# 위에서 태그를 모두 제거하고 내용만 추출
content = tr_data.text.strip()
print("*" * 100)
print(title, score, content)
get_movie_point(1,1)
0
0
제가 질문을 잘 이해하지 못하겠습니다.
"영화제목부터 평점, 감상평까지 가져올수 있지만 감상평만 가져오고 싶은데 어떻게 해야할지 잘 모르겠습니다"
이미 제목, 평점, 감상평을 가져왔다고 하셨는데 거기서 감상평만 가져오고 싶다는말을 이해하지 못하겠습니다.
전체 코드를 올려주시면 더 이해하기 좋을듯 싶습니다