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

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

황재완님의 프로필 이미지

작성한 질문수

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

직접 작성해보며 익숙해지기: 크롤링 기본 연습문제 풀기 (업데이트)

연습 문제 6번 find 이용 질문

작성

·

25

0

css select대신 find 함수를 사용해서 이런 식으로 작성했더니, 같은 결과가 나오긴 했지만 너무 비효율적인거 같아서 질문드립니다. 더 깔끔하게 find를 사용해서 가져오는 방법이 있을까요?

from bs4 import BeautifulSoup
import requests
url="https://davelee-fun.github.io/"
res=requests.get(url)
soup=BeautifulSoup(res.content,"html.parser")
all=soup.find("div", "text-center")
items=all.find("span")
ls=[]
for item in items :
  ls.append(item.get_text().strip())
print(ls[1]+" "+ls[2]+" "+ls[3])

답변 1

0

인프런 AI 인턴님의 프로필 이미지

안녕하세요, 인프런 AI 인턴입니다. 황재완님.

find 함수를 이용한 크롤링 코드에 대해 질문해주셨는데요, 현재 사용하신 코드도 원하는 결과를 출력하는 데 문제는 없지만 더 효율적이고 깔끔한 방법으로 코드를 개선할 수 있습니다.

기본적으로 find는 특정 태그의 첫 번째 매칭 요소를 반환하고, find_all은 모든 매칭 요소를 리스트로 반환합니다. 이런 기능을 활용하면, 문자열을 하나하나 추가하지 않고도 원하는 데이터를 쉽게 가져올 수 있습니다. 아래와 같은 방법을 통해 코드의 효율성을 높일 수 있습니다:

from bs4 import BeautifulSoup
import requests

url = "https://davelee-fun.github.io/"
res = requests.get(url)
soup = BeautifulSoup(res.content, "html.parser")

# 전체 div 태그 중 'text-center' 클래스를 가진 첫 번째 요소 선택
text_center_div = soup.find("div", class_="text-center")

# 해당 div 내부의 모든 span 태그 선택
span_items = text_center_div.find_all("span")

# 각 span 태그의 텍스트를 리스트로 저장
ls = [item.get_text().strip() for item in span_items]

# 리스트에서 필요한 정보 출력
print(" ".join(ls[1:4]))

위의 코드에서는 find_all과 리스트 컴프리헨션을 사용하여 깔끔하게 원하는 내용을 추출하고, join을 사용해 문자열을 합쳤습니다. 이 방법은 가독성을 높이고 추후 유지보수가 용이한 코드를 작성하는 데에 유용합니다.

비슷한 내용의 질문과 답변을 찾을 수 있는 링크는 다음과 같습니다:

  1. 직접 작성해보며 익숙해지기: 크롤링 기본 연습문제 풀기 (업데이트) 4/5번 질문입니다

위 링크에서는 selectfind 사용에 대한 이해도를 높이는 다양한 논의를 다루고 있으니 참고해보시기 바랍니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.