파이썬 BeautifulSoup 선택 탐색 기본 활용법 name attrs string 정리
🔎 웹 스크래핑 필수 도구 BeautifulSoup 선택자 활용법을 쉽고 자세히 알려드립니다
웹에서 원하는 데이터를 효율적으로 가져오려면 단순히 HTML을 파싱하는 것만으로는 부족합니다. 원하는 태그나 속성을 정확히 지정해 필터링하고 탐색할 수 있어야 효율적인 크롤링이 가능하죠. 특히 파이썬 BeautifulSoup의 선택자 기능은 초보자부터 전문가까지 널리 활용되는 핵심 도구입니다. 단순히 태그 이름으로 찾는 것을 넘어, 속성, 정규식, 그리고 사용자 정의 함수까지 적용할 수 있어 웹 페이지 구조가 복잡해도 원하는 데이터를 정확히 추출할 수 있습니다. 이번 글에서는 BeautifulSoup의 name, attrs, string 옵션을 중심으로 기본적인 선택과 탐색 방법을 하나씩 살펴보겠습니다.
실제 사례를 통해 정규식 활용법이나 callable 객체를 이용한 맞춤형 선택도 다루며, 초보자도 쉽게 이해할 수 있도록 단계별로 설명합니다. 또한 단순히 코드 예제를 나열하는 것이 아니라, 어떤 상황에서 어떤 선택 방법이 유용한지 비교하고 정리해드릴 예정입니다. 이 글을 읽으면 더 이상 복잡한 HTML 구조 앞에서 막막함을 느끼지 않고, 자신 있게 필요한 데이터만 뽑아낼 수 있게 될 것입니다.
📋 목차
🔗 name 옵션으로 태그 선택하기
BeautifulSoup에서 가장 기본적으로 사용하는 필터는 name입니다. 이는 HTML 문서에서 특정 태그를 지정할 때 활용되며, 가장 직관적인 방식이라 초보자들이 처음 배우기에 적합합니다. 예를 들어 <a> 태그만 찾고 싶다면 name=’a’를 지정하면 됩니다. 그러면 문서 내 모든 링크 태그가 리스트 형태로 추출됩니다.
또한 name 매개변수에는 문자열뿐 아니라 True, 정규식, 함수(callable)까지 넣을 수 있습니다. True를 넣으면 문서 내의 모든 태그가 탐색 대상이 되고, 정규식을 넣으면 특정 패턴을 가진 태그 이름만 필터링할 수 있습니다. 예를 들어 ^h[1-6]$라는 정규식을 넣으면 h1부터 h6까지의 제목 태그를 한 번에 찾을 수 있습니다.
📌 name 옵션 기본 사용 예시
from bs4 import BeautifulSoup
import re
html = "<html><body><a href='#'>링크1</a><p>문단</p><a href='#'>링크2</a></body></html>"
soup = BeautifulSoup(html, "html.parser")
# a 태그 찾기
print(soup.find_all(name="a"))
# 모든 태그 찾기
print(soup.find_all(name=True))
# 정규식으로 제목 태그 찾기
print(soup.find_all(name=re.compile("^h[1-6]$")))
위 코드를 실행하면 a 태그만 골라내거나, 문서 전체 태그를 확인하거나, 특정 패턴의 태그를 찾을 수 있습니다. 특히 정규식을 이용하면 문서 구조를 한 번에 파악할 수 있어 대규모 크롤링 시 유용하게 활용됩니다.
💡 TIP: name 옵션은 단순 태그 선택뿐 아니라 정규식과 함수까지 적용 가능하므로, 단순 검색을 넘어서는 강력한 탐색 도구가 됩니다.
🛠️ attrs 속성으로 세밀한 탐색하기
HTML 문서에는 태그뿐만 아니라 수많은 속성이 함께 존재합니다. 예를 들어 <div class="content">와 같이 class 속성이 부여된 경우, 단순히 태그 이름만으로는 원하는 요소를 정확히 찾기 어렵습니다. 이때 유용하게 활용할 수 있는 것이 attrs 매개변수입니다. attrs는 딕셔너리 형태로 속성을 지정할 수 있으며, 여러 개의 속성을 동시에 조건으로 줄 수도 있습니다.
예를 들어 attrs={'class':['a','b']}라고 지정하면 class가 ‘a’ 또는 ‘b’인 모든 태그를 선택할 수 있습니다. 또한 id, href, data-*와 같은 다양한 속성에도 적용할 수 있어 복잡한 HTML 구조에서도 특정 요소만 정확히 찾아낼 수 있습니다.
📌 attrs 활용 코드 예시
from bs4 import BeautifulSoup
html = '''
<div class="a">첫 번째 블록</div>
<div class="b">두 번째 블록</div>
<div class="c">세 번째 블록</div>
<a href="https://example.com" id="link1">링크</a>
'''
soup = BeautifulSoup(html, "html.parser")
# class가 a 또는 b인 태그 선택
print(soup.find_all(attrs={"class": ["a", "b"]}))
# id가 link1인 a 태그 선택
print(soup.find_all("a", attrs={"id": "link1"}))
위 예제를 보면 attrs를 활용하여 class 속성이 여러 개일 때도 쉽게 선택할 수 있고, id 같은 고유 속성을 이용해 특정 태그를 지정할 수도 있습니다. 이 방식은 특히 동일한 태그가 여러 개 있을 때 조건을 걸어 정확도를 높이는 데 매우 효과적입니다.
⚠️ 주의: class 속성은 리스트 형태로 다루어질 수 있기 때문에, 정확한 매칭을 위해서는 리스트 조건을 적절히 지정해야 합니다. 단일 문자열 매칭과 리스트 매칭이 다르게 동작할 수 있으므로 반드시 테스트 후 사용하세요.
⚙️ string 필터로 텍스트 매칭하기
HTML 태그는 보통 속성과 함께 본문 텍스트를 포함합니다. 예를 들어 <a href="#">홈으로 이동</a>와 같이 링크 텍스트가 존재하죠. 이런 경우 string 매개변수를 사용하면 태그 내부의 텍스트를 기준으로 탐색할 수 있습니다. 단순히 문자열을 그대로 매칭하는 방법도 있고, 정규식을 활용해 특정 패턴과 일치하는 문자열을 찾을 수도 있습니다.
예를 들어 string=”홈으로 이동”을 지정하면 해당 텍스트를 가진 태그를 찾고, re.compile("이동")을 지정하면 ‘이동’이라는 단어가 포함된 모든 태그를 찾아줍니다. 이 기능은 특히 링크 텍스트나 특정 문구를 기준으로 원하는 요소를 찾을 때 유용합니다.
📌 string 필터 사용 예시
from bs4 import BeautifulSoup
import re
html = '''
<a href="#">홈으로 이동</a>
<a href="#">로그인</a>
<p>안녕하세요</p>
'''
soup = BeautifulSoup(html, "html.parser")
# 특정 텍스트와 일치
print(soup.find_all(string="로그인"))
# 정규식으로 패턴 매칭
print(soup.find_all(string=re.compile("이동")))
위 코드에서 첫 번째 예시는 텍스트가 정확히 ‘로그인’인 경우만 매칭되며, 두 번째 예시는 ‘이동’이라는 단어가 포함된 태그 텍스트를 모두 탐색합니다. 즉, string 매개변수를 사용하면 태그 자체보다는 콘텐츠 텍스트에 초점을 맞춘 선택이 가능합니다.
💎 핵심 포인트:
string 매개변수는 단순 문자열 매칭과 정규식 매칭 모두 가능하므로, 원하는 텍스트 기반 탐색을 유연하게 적용할 수 있습니다.
🔌 정규식을 활용한 고급 선택 방법
웹 크롤링을 하다 보면 단순히 태그 이름이나 속성을 정확히 지정하기 어려운 경우가 많습니다. 이때 정규식(Regular Expression)을 사용하면 훨씬 유연한 탐색이 가능합니다. BeautifulSoup에서는 name, attrs, string 모두 정규식을 지원합니다. 즉, 태그 이름, 속성 값, 태그 내부 텍스트 모두 정규식으로 매칭할 수 있습니다.
예를 들어, 속성 값이 특정 패턴을 포함하는 경우나 태그 이름이 일정 규칙을 따르는 경우 정규식을 사용하면 반복되는 조건을 간단히 처리할 수 있습니다. 이를 통해 대규모 HTML 문서에서도 필요한 요소를 신속하게 걸러낼 수 있습니다.
📌 정규식 활용 코드 예시
from bs4 import BeautifulSoup
import re
html = '''
<h1>제목1</h1>
<h2>제목2</h2>
<div class="box-123">내용A</div>
<div class="box-456">내용B</div>
<p>데이터 수집 예제</p>
'''
soup = BeautifulSoup(html, "html.parser")
# h 태그 계열 전체 선택
print(soup.find_all(name=re.compile("^h[1-6]$")))
# class 속성이 'box-'로 시작하는 div 선택
print(soup.find_all("div", attrs={"class": re.compile("^box-")}))
# 텍스트에 '데이터' 포함된 요소 찾기
print(soup.find_all(string=re.compile("데이터")))
위 코드에서 정규식을 통해 h1~h6까지 모든 제목 태그를 한 번에 선택하거나, class 이름이 특정 패턴으로 시작하는 요소를 걸러낼 수 있습니다. 또한 텍스트 안에 특정 키워드가 포함된 경우에도 간단히 매칭할 수 있습니다.
💡 TIP: 정규식을 사용할 때는 반드시 패턴이 의도한 대로 동작하는지 확인해야 합니다. 너무 포괄적인 패턴은 불필요한 데이터까지 매칭할 수 있으므로, 적절한 범위를 설정하는 것이 중요합니다.
💡 callable을 이용한 맞춤형 필터링
BeautifulSoup의 강력한 기능 중 하나는 함수(callable)를 활용한 필터링입니다. name, attrs, string 매개변수 모두 함수형 필터를 지원하며, 해당 함수가 True를 반환하는 요소만 선택됩니다. 이를 통해 단순히 문자열이나 정규식으로 해결하기 어려운 복잡한 조건을 세밀하게 제어할 수 있습니다.
예를 들어 class 속성이 특정 패턴을 포함하고 동시에 텍스트 길이가 일정 이상인 경우만 필터링하거나, 특정 속성이 존재하는지 여부만 확인하는 조건을 함수로 직접 구현할 수 있습니다. 이 방식은 웹 페이지 구조가 불규칙하거나 동적으로 생성되는 경우에도 유용합니다.
📌 callable 필터 활용 예시
from bs4 import BeautifulSoup
html = '''
<div class="info">짧은 텍스트</div>
<div class="info">이 문장은 길이가 제법 깁니다.</div>
<a href="https://example.com">외부 링크</a>
<a href="/internal">내부 링크</a>
'''
soup = BeautifulSoup(html, "html.parser")
# 텍스트 길이가 10자 이상인 div만 선택
def long_text(tag):
return tag.name == "div" and tag.string and len(tag.string) >= 10
print(soup.find_all(long_text))
# 외부 링크만 선택
def external_link(tag):
return tag.name == "a" and tag.has_attr("href") and tag["href"].startswith("http")
print(soup.find_all(external_link))
첫 번째 함수는 div 태그 중 텍스트 길이가 10자 이상인 요소만 추출하고, 두 번째 함수는 href 속성이 http로 시작하는 외부 링크만 필터링합니다. 이처럼 callable을 활용하면 정규식이나 단순 매칭보다 훨씬 정밀한 조건을 구현할 수 있습니다.
💎 핵심 포인트:
callable 필터는 조건문을 자유롭게 정의할 수 있어 복잡한 HTML 구조에서도 정확한 데이터 선택을 가능하게 합니다.
❓ 자주 묻는 질문 (FAQ)
BeautifulSoup에서 name과 attrs는 어떻게 다른가요?
attrs에서 class를 리스트로 지정하는 이유가 있나요?
string 매개변수는 언제 유용한가요?
정규식은 어떤 경우에 사용해야 할까요?
callable 필터는 정규식보다 더 좋은가요?
find와 find_all의 차이는 무엇인가요?
attrs로 data-* 속성도 선택할 수 있나요?
BeautifulSoup과 CSS 선택자 중 어느 것이 더 좋을까요?
📌 BeautifulSoup 선택·탐색 기본 정리
이번 글에서는 파이썬 BeautifulSoup에서 자주 활용되는 name, attrs, string 옵션을 중심으로 선택과 탐색 방법을 정리했습니다. name 옵션은 태그 이름을 기준으로 선택하며 True, 정규식, callable까지 적용 가능해 단순 검색부터 고급 매칭까지 지원합니다. attrs는 태그 속성을 기반으로 필터링할 수 있어 class, id, data-* 같은 조건을 손쉽게 걸 수 있습니다. string은 태그 내부 텍스트를 기준으로 매칭할 수 있어 특정 문구 검색에 유용합니다. 나아가 정규식과 callable 필터를 조합하면 복잡한 조건까지 자유롭게 구현할 수 있습니다.
즉, BeautifulSoup은 단순 HTML 파서가 아니라 다양한 조건을 유연하게 설정할 수 있는 강력한 데이터 탐색 도구입니다. 웹 크롤링을 하면서 정규식과 callable을 적절히 활용한다면, 불필요한 데이터는 걸러내고 원하는 정보만 빠르게 수집할 수 있습니다. 이러한 기능을 잘 익혀두면 효율적인 데이터 수집과 분석에 큰 도움이 될 것입니다.
🏷️ 관련 태그 : 파이썬, BeautifulSoup, 웹크롤링, 웹스크래핑, 정규식, 데이터수집, 파이썬기초, 크롤링예제, 텍스트분석, 데이터전처리