인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

윤태영님의 프로필 이미지
윤태영

작성한 질문수

남박사의 파이썬 기초부터 실전 100% 활용

네이버평점 크롤링에서 질문있습니다

작성

·

545

1

trs = bs.select("table.list_netizen > tbody > tr")
        for tr in trs:
            content=tr.find("td",{"class","title"}).text
            content=content.split('\n')
            content="\n".join(content[0:6])
            print(content)
            print()
강의에서와 현재 평점사이트의 테이블 구성이 바뀌어 다른방법으로 해봤는데요,
이런식으로 하면 영화제목부터 평점, 감상평까지 가져올수 있지만
감상평만 가져오고 싶은데 어떻게 해야할지 잘 모르겠습니다
아래는 테이블구조입니다

답변 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

윤태영님의 프로필 이미지
윤태영
질문자

import requests
from bs4 import BeautifulSoup
#select는 만족하는 여러 인스턴스를 찾고, find는 첫 번째 인스턴스를 반환합니다.
def get_movie_point(startend):
    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 = tr.select("td")
            # title= td[1].select("a")[0].text
            # score=tr.find("div",{"class":"list_netizen_score"}).find("em").text
            # print(title, score)

            content=tr.find("td",{"class","title"}).text
            content=content.split('\n')
            content="\n".join(content[0:6])
            print(content)
            print()
            
get_movie_point(1,1000)
           
td클래스의 텍스트를 모두가져오면 제목,별점,감상평 다 가져와지지만
다른 정보는 냅두고 감상평에만 접근해서 데이터를 가져오는 방법을 알고싶습니다

0

남박사님의 프로필 이미지
남박사
지식공유자

제가 질문을 잘 이해하지 못하겠습니다.

"영화제목부터 평점, 감상평까지 가져올수 있지만 감상평만 가져오고 싶은데 어떻게 해야할지 잘 모르겠습니다"

이미 제목, 평점, 감상평을 가져왔다고 하셨는데 거기서 감상평만 가져오고 싶다는말을 이해하지 못하겠습니다. 

전체 코드를 올려주시면 더 이해하기 좋을듯 싶습니다

윤태영님의 프로필 이미지
윤태영

작성한 질문수

질문하기