파이썬 BeautifulSoup select 결과가 이상합니다.

조회수 993회

파이썬 크롤링을 연습하고 있는데, 다음과 같이 네이버 통합검색에서 section을 수집해보고 있습니다.

다음 코드로 검색하면 section이라는 단어가 9개가 나와야 할텐데 2개만 나옵니다. 어떻게 해결할 수 있을까요?

body > div > div > div > div > section 또는 #main_pack > section 경로를 사용해서 해결하고 싶습니다.

#main_pack > section 으로 입력하면 결과값이 6개가 나와야 할텐데 1개만 나옵니다..

import requests
import urllib.request
from bs4 import BeautifulSoup

url = 'https://search.naver.com/search.naver?where=nexearch&sm=top_hty&fbm=1&ie=utf8&query=%EC%82%BC%EC%84%B1%EC%A0%84%EC%9E%90'
r = requests.get(url)
soup = BeautifulSoup(r.text, 'html.parser')

sections = soup.select('body > div > div > div > div > section')
for section in sections:
       section = section.name
       print (section)
  • 두개가 어떤게 나오는지 궁금하네요. 경로에 'body section' 해도 2개만 나오나요? 알 수 없는 사용자 2020.12.1 09:32
  • 그냥 section만 입력하면 9개가 나옵니다. 그런데 이렇게 되면 다른 태그, 예를 들어 body div 같은 경우 검색했을때 너무 많은 태그가 읽히는 문제가 생겨서 정확한 경로를 입력해서 해결하고 싶습니다. html을 긁어오는데 문제가 있나 싶어서 확인해봤는데 html을 긁어오는건 문제가 없더라구요.. 초보자 2020.12.1 09:34
  • 아니면 범위를 sections = soup.select('.pack_group section') 이렇게 변경하시는건 어떤가요 알 수 없는 사용자 2020.12.1 10:11
  • 다른태그 검색시 어떤 문제가 생기는지 궁금하네요 알 수 없는 사용자 2020.12.1 10:11
  • 예를 들어 soup.select('#main_pack > div') 으로 검색할 경우 html상에서는 2개의 결과를 확인할 수 있는데 코드를 실행하면 하나도 가져오지 못합니다. 초보자 2020.12.1 10:31
  • 일단 테스트해본결과 beautifulsoup 의 select 기능으로는 body > div > div > div > div > section 를 만족할수는 없을거같습니다. 말씀하신대로 하려면 특정성이 주어져야 해결가능할거같습니다. id, class , [href=""] 등의 css선택자를 사용하여 원하는 결과만 뽑아내야 가능할듯하네요 알 수 없는 사용자 2020.12.1 12:18
  • html을 직접 확인해보면 html 상에서는 문제가 없는데 왜 select 함수가 제대로 작동이 안되는건지 모르겠네요.. 초보자 2020.12.1 12:58
  • 네 저도 r.txt 전부 읽어와서 보니까 html상의 문제는 없습니다. select함수의 버그인거 같군요. body > div > div > div > div > section 이런식으로 작동해야한다면 함수를 하나 정의해서 (열고 닫는 태그)를 이용해서 깊이 탐색 후 추출하면 될거같습니다. 알 수 없는 사용자 2020.12.1 14:58
  • 버그를 제가 어떻게 할 수 있는 것도 아니고 이런 문제가 있다고 알아만 둬야겠네요 ㅠㅠ 초보자 2020.12.1 15:33

1 답변

  • 좋아요

    1

    싫어요
    채택 취소하기
    import requests
    import urllib.request
    from bs4 import BeautifulSoup
    
    url = 'https://search.naver.com/search.naver?where=nexearch&sm=top_hty&fbm=1&ie=utf8&query=%EC%82%BC%EC%84%B1%EC%A0%84%EC%9E%90'
    r = requests.get(url)
    soup = BeautifulSoup(r.text, 'html.parser')
    sections = soup.select('#main_pack section')
    #sections = soup.select('body > div > div > div > div > section')
    for section in sections:
           section = section.name
           print (section)
    

    일단 이렇게하면 6개가 정상출력됩니다.

    • (•́ ✖ •̀)
      알 수 없는 사용자
    • 죄송합니다... 해당 방법의 경우 section처럼 거의 유일한 태그면 문제가 없지만, 예를 들어 #main_pack div 같은 경로로 탐색하게되면 수많은 태그를 가져오는 대참사가 일어나기때문에 가능하면 #main_pack > section 처럼 정확한 위치를 지정한 상태로 해결하고 싶습니다. 초보자 2020.12.1 10:19

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

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

(ಠ_ಠ)
(ಠ‿ಠ)