작성
·
10
·
수정됨
0
안녕하십니까. 강의 잘 듣고 있습니다. 다름이 아니라 선생님의 풀이와 제 풀이의 답은 같으나 과정에서 약간의 차이가 있어 질문 드립니다.
우선 예제 2번의 경우 저는
import requests
from bs4 import BeautifulSoup
res=requests.get('https://davelee-fun.github.io/')
soup=BeautifulSoup(res.content, 'html.parser')
items= soup.select_one('h1.sitetitle')
print(items.get_text())
이러한 풀이 방식을 썼습니다. 의도를 표현해보자면 'Teddy의 선물 블로그' 라는 단일 데이터를 뽑아낼 것이므로 'select'가 아닌 특정 포인트만 뽑아 주는 'select_one'을 사용 했으며, 역시나 단일 데이터를 뽑아낼 것이므로 굳이 반복문인 'for ~ in ~'을 쓰지 않고 'print'만을 사용 했습니다. 이러한 저의 접근 방식이 오류가 없는지 궁금합니다.
아래의 풀이는 선생님께서 해주신 풀이 입니다.
import requests
from bs4 import BeautifulSoup
url = 'https://davelee-fun.github.io/'
res = requests.get(url)
soup = BeautifulSoup(res.content, 'html.parser')
items = soup.select('h1.sitetitle')
for item in items:
print (item.get_text().strip())
예제 4번 질문 입니다.
4번의 경우 저의 풀이는
import requests
from bs4 import BeautifulSoup
res=requests.get('https://davelee-fun.github.io/')
soup=BeautifulSoup(res.content, 'html.parser')
items= soup.select('section.featured-posts h4.card-text')
for item in items:
print(item.get_text().strip())
이러한 풀이 방식을 썼습니다. 그 의도는 items= soup.select('section.featured-posts h4.card-text')에서 보면 section 이라는 태그의 .featured-posts 이라는 클래스명 산하의 h4 이라는 태그의 .card-text 클래스명을 가진 것들의 데이터를 추출하고 싶다는 뜻 이였습니다.
저는 이것을 'section.featured-posts h4.card-text' 이라는 방식으로 띄워쓰기를 이용하여 한 번에 표현해도 문제 없을 것이라고 판단했으나 선생님의 풀이를 보았을 때
import requests
from bs4 import BeautifulSoup
url = 'https://davelee-fun.github.io/'
res = requests.get(url)
soup = BeautifulSoup(res.content, 'html.parser')
box = soup.select_one('section.featured-posts')
items = box.select('h4.card-text')
for item in items:
print (item.get_text().strip())
라는 방식으로 어떻게 보면 두 번으로 나누어 표현했음을 이해했습니다. 단순 방식의 차이인지 제가 틀리게 표현 했는데 우연히 맞은 것인지 알고 싶습니다.
마지막으로 6번 예제 질문입니다.
6번의 경우 저의 풀이는
import requests
from bs4 import BeautifulSoup
res=requests.get('https://davelee-fun.github.io/')
soup=BeautifulSoup(res.content, 'html.parser')
items= soup.select('div.container.text-center > span')
print(items.get_text().strip())
이러합니다. 의도를 설명하지면 div 이라는 태그의 .container 와 .text-center 이라는 두 개의 클래스명을 지닌 것 바로 아래의 > span 라는 태그 내의 데이터를 추출하고 싶다는 의미였습니다.
이렇게 하면 'Never miss a story from us, subscribe to our newsletter' 라는 내용을 뽑아 낼 수 있을 것으로 보았으며,
'Never miss a story from us, subscribe to our newsletter' 라는 단일 데이터를 추출 하는 것이니 'select'를 썼더라도 굳이 반복문인 'for ~ in ~'을 사용하지 않아도 될 것이라고 생각했지만
'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()?' 라는 오류가 떴습니다. 그래서
items= soup.select('div.container.text-center > span')
for item in items:
print(item.get_text().strip())
또는
items= soup.select_one('div.container.text-center > span')
print(items.get_text().strip())
라고 바꾸어 써보니 제대로 된 답이 출력 되었습니다. 저의 첫 오답의 경우
items= soup.select('div.container.text-center > span')
print(items.get_text().strip()) 이 구문은 items가 list 형식이며, 그래서 for 반복문을 사용하지 않고는 get_text()를 사용할 수 없다는 ai의 답변을 받았지만 뭔가 알듯 말 듯한 느낌이라 다시 설명을 듣고 싶습니다.
그리고 제대로 된 답이 도출 된 위 두 개의 경우의 차이를 알고 싶습니다.
긴 글 읽어주셔서 감사합니다. 좋은 하루 보내세요.^^
답변 1
0
안녕하세요, 인프런 AI 인턴입니다.
질문해주신 세 가지 예제에 대해 답변 드리겠습니다.
질문:
단일 데이터를 뽑아낼 때 select_one
을 사용하는 것이 더 적절한지, for
문 없이 print
만 사용해도 되는지에 대한 질문입니다.
답변:
select_one
은 단일 요소를 선택할 때 사용하는 적절한 메서드입니다. 따라서 ‘Teddy의 선물 블로그’ 같은 단일 데이터를 추출할 때 select_one
을 사용하는 것이 맞습니다. 또한, 단일 데이터이므로 반복문 없이 print
로 출력하는 것도 잘 하신 것입니다. 여기서 select_one
을 사용하면, 반환 결과가 단일 요소이기 때문에 바로 get_text()
를 사용할 수 있습니다.
관련 질문 URL: 정확한 데이터 추출을 위한 select_one 사용법
질문:
CSS 선택자를 한 줄로 표현하는 방식과 태그를 나누어 선택하는 방식의 차이 여부에 대한 질문입니다.
답변:
CSS 선택자를 한 줄로 표현하는 방식(section.featured-posts h4.card-text
)과 태그를 나누어 선택하는 방식(box.select('h4.card-text')
)은 기능적으로 동일합니다. 두 방법 모두 섹션 내의 특정 클래스를 가진 h4
태그들을 정확히 선택할 수 있습니다. 따라서, 두 가지 방법 모두 올바릅니다. 다만, 태그를 나누어 선택하는 방식은 코드의 가독성을 높일 수 있습니다.
관련 질문 URL: CSS 선택자를 사용한 데이터 추출 방법
질문:
무엇이 잘못되었는지, 그리고 select
와 select_one
의 차이점에 대한 설명 요청입니다.
답변:
select
메서드는 조건에 맞는 모든 요소를 리스트 형태로 반환합니다. 따라서 단일 요소를 추출할 때 select
를 사용하면 리스트에 담기게 되며, 리스트에서 get_text()
를 직접 호출할 수 없어 오류가 발생합니다.
이를 해결하는 방법은 두 가지입니다:
1. select_one
을 사용해서 단일 요소로 바로 추출하는 방법.
2. for
문을 사용해 리스트 내의 요소에 get_text()
를 사용하는 방법.
select_one
은 조건에 맞는 첫 번째 요소만 반환하므로, 요소가 단일일 경우 바로 get_text()
를 사용할 수 있습니다.
관련 질문 URL: select와 select_one의 차이점
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
아니 ai가 이렇게 원하는 부분을 정확히 알려주다니 놀랍네요...