1. find
와 find_all
를 왜 사용할까?
오늘은 HTML 문서에서 특정 요소를 효과적으로 추출하기 위해 사용할 수 있는 두 가지 주요 메소드 find
와 find_all
에 대해 이야기해 볼게.
코드를 작성하기 전에, 왜 이 메소드들이 필요한지 얘기해보자. 웹 페이지를 거대한 도서관이라고 상상해 봐. 모든 단어나 문장은 HTML 요소로 되어 있어. 이런 정보들을 찾는 건 어떤 맛의 아이스크림인지 모르고 맞추는 것과 같을 수 있어. find
와 find_all
메소드는 너의 "맛 탐지기" 같은 역할을 해줄 거야. 이걸로 필요한 정보를 정확히 찾을 수 있어.
find
: 이 메소드는 아침에 첫 커피 한 잔을 찾는 것처럼 빠르게 특정 조건에 맞는 첫 번째 요소를 찾아줘.find_all
: 이건 좀 더 여유롭고 철저한 방식인데, 조건에 맞는 모든 요소의 리스트를 반환해. 여러 개의 정보를 얻고 싶을 때 딱이야 (예를 들어 하루 종일 여러 잔의 커피처럼).
2. find
사용하기
find
메소드는 첫 번째로 일치하는 요소를 빠르게 추출해야 할 때 쓸 수 있어. 이 메소드는 태그 이름, 속성, 함수 같은 다양한 매개변수를 받을 수 있지.
find
메소드 시그니처
find(name=None, attrs={}, recursive=True, string=None, **kwargs)
find
메소드 매개변수
- name: 찾고 싶은 태그 이름이야.
div
,p
,h1
,a
등 HTML 태그라면 뭐든 될 수 있어. - attrs: 태그 속성의 딕셔너리. 예를 들어
{'class': 'example'}
또는{'id': 'main'}
. 이 매개변수로 검색을 좁힐 수 있어. - recursive: 이 메소드는 태그를 모든 중첩 수준에서 검색할지 여부를 결정하는 부울 매개변수야. 기본값은
True
로, 모든 중첩 수준에서 검색이 이루어진다는 뜻이야. - string: 특정 텍스트 포함 요소를 검색해. 텍스트 내용으로 필터링할 때 유용하지.
- kwargs: 속성을 기준으로 검색할 때 추가적인 매개변수를 사용할 수 있어.
class_
같은 걸 지정하면attrs={'class': 'value'}
로 해석돼.
예제
from bs4 import BeautifulSoup
html_doc = """
The Dormouse's story
The Dormouse's story
Once upon a time there were three little sisters; and their names were
Elsie,
Lacie and
Tillie;
and they lived at the bottom of a well.
"""
soup = BeautifulSoup(html_doc, 'html.parser')
first_link = soup.find('a') # 첫 번째 태그 찾기.
print(first_link) # 출력: Elsie
보다시피, find
메소드는 문서 내 첫 번째 <a>
태그를 찾아냈고, 우리는 필요한 정보를 찾은 상태에서 탐색을 계속할 수 있어.
3. find_all
사용하기
find_all
메소드는 지정된 조건에 맞는 모든 요소의 리스트를 반환해. 특정 유형의 태그나 클래스가 있는 모든 요소를 가져와야 할 때 매우 유용해.
find_all
메소드 시그니처
find_all(name=None, attrs={}, recursive=True, string=None, limit=None, **kwargs)
find_all
메소드 매개변수
- name: 찾고자 하는 태그 이름이야. 태그 이름 문자열(
div
,a
,p
등)이거나 태그 리스트(["div", "p"]
)일 수 있어. - attrs: 태그를 필터링하기 위한 속성 딕셔너리. 예:
{'class': 'example'}
. - recursive: 검색을 중첩된 태그까지 수행할지 결정해. 기본값은
True
. - string: 지정된 텍스트를 포함한 태그를 찾아.
- limit: 반환된 결과의 최대 개수를 제한해. 지정되면 메소드는 최대
limit
개의 요소를 반환해. - kwargs: 태그 속성을 필터링하기 위한 추가적인 매개변수야.
find_all
사용 예제
find
가 필요한 책 한 권을 빨리 찾는 것과 같다면, find_all
은 섹션별로 모든 제목을 확인하며 더 깊이 파고드는 것과 같아.
all_links = soup.find_all('a') # 모든 태그 찾기.
for link in all_links:
print(link.get('href')) # 링크 출력: http://example.com/elsie, http://example.com/lacie, http://example.com/tillie
이 예제에서는 모든 <a>
태그를 검색한 후, 각 태그에서 링크를 추출했어. 페이지에서 모든 링크를 수집하는 데 유용하지.
중요! find()
와 find_all()
메소드는 soup 객체뿐만 아니라 find()
, select()
등으로 반환된 모든 하위 요소에서도 호출할 수 있어.
GO TO FULL VERSION