파이썬 웹스크래핑 질문 입니다!

조회수 697회

네이버 홈페이지에서 검색창 바로 밑에 있는 메뉴(?)들을 스크래핑 해서 메뉴들의 제목을 출력하려 합니다.

html 에서 copy -> copy selector 를 통해 메뉴들을 스크래핑 했는데 똑같은 방식으로 적용해도 어떤 메뉴는 스크래핑이 되고 어떤 메뉴는 스크래핑이 안됩니다.

  • 변수 mail, tv는 오류는 안나오지만 값이 None이 나오고
  • 변수 book과 webtoon은 오류 구문 : AttributeError: 'NoneType' object has no attribute 'string'이 나오고 copy selector로는 스크래핑이 안되던 것들이 밑에 코드에 적혀 있는
  • test = vibe.next_sibling.next_sibling을 이용하면 book,
  • test = vibe.next_sibling.next_sibling..next_sibling.next_sibling을 이용하면 webtoon에 접근이 가능하지만

이런 방식으로 vibe대신에 pay를 넣으면 이번엔 tv가 접근이 안됩니다.

오류 구문 : AttributeError: 'NoneType' object has no attribute 'next_sibling'이 나옵니다

질문은

  1. 똑같은 방식으로 접근했는데 왜 어떤 메뉴는 스크래핑이 되고 어떤 메뉴는 스크래핑이 안되는지
  2. 어떻게 코드를 수정해야 각 메뉴들의 제목을 스크래핑 할 수 있는지
  3. 각 오류들의 원인이 사이트에서 값들을 가져오는데 실패를 해서 그런건지, 실패를 했다면 왜 어떤 것은 그냥 None으로 나오고 어떤것은 오류구문이 나오면서 다르게 나오는건지
import requests
from bs4 import BeautifulSoup

URL = 'https://www.naver.com/' 
page = requests.get(URL)
page.raise_for_status()


soup = BeautifulSoup(page.content, 'html.parser')

mail = soup.select_one("#NM_FAVORITE > div.group_nav > ul.list_nav.type_fix > li:nth-child(1) > a") #안됨

cafe = soup.select_one("#NM_FAVORITE > div.group_nav > ul.list_nav.type_fix > li:nth-child(2) > a")#됨
blog = soup.select_one("#NM_FAVORITE > div.group_nav > ul.list_nav.type_fix > li:nth-child(3) > a")#됨
knowledge = soup.select_one("#NM_FAVORITE > div.group_nav > ul.list_nav.type_fix > li:nth-child(4) > a")#됨
shop = soup.select_one("#NM_FAVORITE > div.group_nav > ul.list_nav.type_fix > li:nth-child(5) > a")#됨
pay = soup.select_one("#NM_FAVORITE > div.group_nav > ul.list_nav.type_fix > li:nth-child(6) > a")#됨

tv = soup.select_one("#NM_FAVORITE > div.group_nav > ul.list_nav.type_fix > li:nth-child(7) > a") #안됨

dictionary = soup.select_one("#NM_FAVORITE > div.group_nav > ul.list_nav.NM_FAVORITE_LIST > li:nth-child(1) > a") #됨
news = soup.select_one("#NM_FAVORITE > div.group_nav > ul.list_nav.NM_FAVORITE_LIST > li:nth-child(2) > a")#됨
stock = soup.select_one("#NM_FAVORITE > div.group_nav > ul.list_nav.NM_FAVORITE_LIST > li:nth-child(3) > a")#됨
ground = soup.select_one("#NM_FAVORITE > div.group_nav > ul.list_nav.NM_FAVORITE_LIST > li:nth-child(4) > a")#됨
map_1 = soup.select_one("#NM_FAVORITE > div.group_nav > ul.list_nav.NM_FAVORITE_LIST > li:nth-child(5) > a")#됨
movie = soup.select_one("#NM_FAVORITE > div.group_nav > ul.list_nav.NM_FAVORITE_LIST > li:nth-child(6) > a")#됨
vibe = soup.select_one("#NM_FAVORITE > div.group_nav > ul.list_nav.NM_FAVORITE_LIST > li:nth-child(7) > a")#됨

test = vibe.next_sibling.next_sibling  #이렇게 하면 밑에 test가 book이 됨

book = soup.select_one("#NM_FAVORITE > div.group_nav > ul.list_nav.NM_FAVORITE_LIST > li:nth-child(8) > a")#안됨
webtoon = soup.select_one("#NM_FAVORITE > div.group_nav > ul.list_nav.NM_FAVORITE_LIST > li:nth-child(9) > a") #안됨

print(webtoon.string) #webtoon 자리에 각 변수들 입력해서 시험해보았습니다
  • print(str(soup)) 해서 다 찍어본 다음 거기서 다시 찾아보시겠어요? 엽토군 2021.3.24 14:22

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)