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

jungaapark님의 프로필 이미지
jungaapark

작성한 질문수

파이썬입문과 크롤링기초 부트캠프 [파이썬, 웹, 데이터 이해 기본까지] (업데이트)

직접 작성해보며 익숙해지기: 크롤링과 전처리 이해하기 (업데이트)

find와 select 호환 사용에 대하여.

작성

·

1.4K

0

안녕하세요^^ 먼저 좋은 강의 해주셔서 큰 도움 받고 있는 수강생입니다. 쉽게 설명해주셔서 순식간에 강의를 들으며 여기까지 왔습니다. 

강의 내용을 따라해보던 중, 아래와 같은 코드로 설명해주신 부분을 따라하고 있었는데요. 

import requests

from bs4 import BeautifulSoup

res=requests.get('https://finance.naver.com/sise/')

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

data=soup.select('div.rgt > ul.lst_major > li')

for item in data:

    print(item.find('a').get_text(),item.find('span').get_text(),item.find('em').get_text())

맨 아랫줄에서 find 대신 select도 되는지 넣어보았는데, find를 모두 select로 바꿔 넣으면 아래와 같은 에러가 뜹니다. 

AttributeError: ResultSet object has no attribute 'get_text'. You're probably treating a list of elements like a single element. Did you call find_all() when you meant to call find()?

그래서 select를 사용하면 get_text()를 사용할 수 없다는 의미 같아서요. 아래와 같이 다시 작성해보았는데요. 

import requests from bs4 import BeautifulSoup res=requests.get('https://finance.naver.com/sise/') soup=BeautifulSoup(res.content, 'html.parser') data=soup.select('div.rgt > ul.lst_major > li') for item in data: data1=item.select('a') print(data1.get_text())


이렇게 해도 같은 에러메세지가 떠서요. 혹시 select 하에 select를 또 사용하는게 잘못된건가요? 또는 제가 select를 잘못 활용하고 있는것인가요? 해당 부분을 강의 다시 들었는데도 잘 모르겠어서 질문 드립니다. 

따라하며 배우니 재미있게 잘 왔지만, 응용하려면 아무래도 더 많은 시간 고민하고 공부해야겠다는 생각이 드네요. ^^; 

답변 3

1

for item in data:
    data1=item.select('a')
    print(data1.get_text())

제가 알기로는 select - select 사용 가능합니다. 다만, jungaapark님께서 작성하신 코드를 보면,
data1=item.select('a') 부분에서 select를 사용하셨는데, 이 경우에는 data1이 리스트가 됩니다.
그리고, 리스트가 된 경우에는 get_text()를 사용할 수 없어요.
data1을 for문으로 푸는 코드를 작성하거나 (리스트 전체 출력), select_one을 사용해서 첫번째 값을 뽑는 두가지 방법이 있을 것 같네요.

값 하나 : select_one = find
리스트 : select = find_all
리스트일 때는 for문으로 풀기, 값이 하나만 들어있을 때는 그냥 print로 출력 가능.
이렇게 생각하시면 좋을 것 같습니다.

0

jungaapark님의 프로필 이미지
jungaapark
질문자

select 후에 바로 select는 사용할 수 없나보네요.. 말씀하신대로 select_one으로 설정하니 실행이 됩니다!

빠른 답변 정말 정말 감사드립니다! 

0

안녕하세요~,

선택자 사용을 잘못하신거 같아요.

select 가 아니라 select_one 으로 바꿔주셔요.

첫번째 -----------------

import requests

from bs4 import BeautifulSoup

res=requests.get('https://finance.naver.com/sise/')

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

data=soup.select('div.rgt > ul.lst_major > li')

for item in data:

    print(item.select_one('a').get_text(),item.select_one('span').get_text(),item.select_one('em').get_text())

두번째 ------------------

import requests

from bs4 import BeautifulSoup

res=requests.get('https://finance.naver.com/sise/')

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

data=soup.select('div.rgt > ul.lst_major > li')

for item in data:

    data1=item.select_one('a')

    print(data1.get_text())

jungaapark님의 프로필 이미지
jungaapark

작성한 질문수

질문하기