파이썬 BeautifulSoup 텍스트 정규식 숫자 날짜 추출과 데이터 후처리 파이프라인
🚀 웹 스크래핑에서 숫자와 날짜를 깨끗하게 가공하는 방법을 배워보세요
웹 데이터는 구조화된 경우도 있지만, 대부분은 텍스트 안에 섞여 있는 숫자나 날짜처럼 가공이 필요한 정보로 가득합니다.
특히 파이썬 BeautifulSoup를 활용해 HTML을 파싱하다 보면 정규식과 함께 숫자, 통화, 날짜 등을 추출해야 할 일이 잦습니다.
그런데 단순히 추출만 한다고 끝나는 게 아니라, int, float 변환, locale 기반 포맷 처리, strip/replace 전처리 같은 후속 단계가 반드시 따라와야 하죠.
이 글에서는 그러한 과정을 효율적으로 처리할 수 있는 파이프라인을 소개합니다.
복잡하게 흩어진 데이터를 깔끔하게 정리하는 방법을 함께 살펴볼게요.
특히 데이터 분석이나 크롤링 프로젝트를 진행할 때 이런 후처리 과정을 체계적으로 관리하지 않으면, 매번 같은 전처리 코드를 반복하거나 숫자/날짜 포맷이 제각각 달라져서 오류가 생길 수 있습니다.
따라서 정규식 추출부터 변환, 로케일 포맷, 문자열 정리까지 하나의 데이터 파이프라인으로 관리하는 것이 중요합니다.
이 포스트는 실제 실무에서 바로 활용할 수 있는 코드 예제와 함께, 안정적인 데이터 처리 흐름을 만들어가는 방법을 설명합니다.
📋 목차
🔎 BeautifulSoup로 텍스트에서 숫자와 날짜 찾기
웹 페이지에서 원하는 정보를 뽑아내려면 가장 먼저 HTML 구조를 이해하고, 특정 태그 안에 들어 있는 텍스트를 가져와야 합니다.
파이썬의 BeautifulSoup은 HTML을 손쉽게 파싱하고, 원하는 요소를 선택할 수 있게 도와줍니다.
예를 들어 가격 정보가 <span class="price"> 안에 들어 있거나, 날짜 정보가 <time> 태그에 포함된 경우, BeautifulSoup를 통해 텍스트를 추출할 수 있습니다.
하지만 텍스트로 가져온 데이터에는 불필요한 공백, 단위(예: 원, 달러, %), 혹은 지역별 포맷 차이가 섞여 있는 경우가 많습니다.
이때 단순히 문자열로만 다루면 계산이나 비교가 불가능해집니다.
따라서 숫자와 날짜를 추출한 뒤 후처리를 거쳐야 실제 분석에 활용할 수 있습니다.
from bs4 import BeautifulSoup
html = '<span class="price">₩12,300</span> <time>2025-08-29</time>'
soup = BeautifulSoup(html, "html.parser")
price_text = soup.find("span", class_="price").get_text()
date_text = soup.find("time").get_text()
print(price_text) # ₩12,300
print(date_text) # 2025-08-29
위 코드처럼 텍스트를 추출하면 기본적으로 문자열이 반환됩니다.
여기서 숫자는 정규식을 이용해 숫자만 뽑아내고, 날짜는 datetime 파서로 변환해야 분석이나 계산이 가능해집니다.
💡 TIP: BeautifulSoup로 가져온 텍스트는 항상 문자열이므로, 실제 연산에 쓰려면 반드시 숫자나 날짜로 변환하는 단계를 거쳐야 합니다.
🧩 정규식으로 데이터 패턴 추출하기
BeautifulSoup로 텍스트를 가져왔다면, 이제 정규식을 활용해 숫자와 날짜 패턴을 뽑아낼 수 있습니다.
정규식은 데이터 안에서 규칙적인 패턴을 찾아내는 데 매우 강력한 도구로, 가격, 퍼센트, 날짜 같은 항목을 구분할 때 특히 유용합니다.
예를 들어 “₩12,300”이라는 문자열이 있다면, 실제로 필요한 값은 숫자 12300입니다.
또 “2025-08-29” 같은 날짜 문자열은 YYYY-MM-DD 패턴을 찾는 정규식을 적용해 추출할 수 있습니다.
이 과정을 거치면 불필요한 기호나 문자를 제거하고 핵심 데이터만 얻을 수 있습니다.
import re
text_price = "₩12,300"
text_date = "2025-08-29"
# 숫자 추출
price = re.sub(r"[^0-9]", "", text_price)
print(price) # 12300
# 날짜 추출 (YYYY-MM-DD)
date_match = re.search(r"\d{4}-\d{2}-\d{2}", text_date)
if date_match:
print(date_match.group()) # 2025-08-29
정규식을 사용할 때는 데이터의 형식을 정확히 파악하는 것이 중요합니다.
웹사이트마다 가격을 ‘12,300원’, ‘12,300 KRW’, ‘₩12,300’처럼 다르게 표시할 수 있기 때문에, 상황에 맞는 패턴을 만들어야 합니다.
날짜 역시 ‘2025-08-29’, ‘2025/08/29’, ‘August 29, 2025’처럼 표현 방식이 달라질 수 있습니다.
⚠️ 주의: 정규식은 데이터 형식이 조금만 달라져도 매칭이 실패할 수 있습니다. 반드시 여러 케이스를 테스트해보고 패턴을 유연하게 설계해야 합니다.
⚙️ int와 float로 변환하는 후처리
정규식으로 숫자만 추출했다면, 이제 이를 int 또는 float 자료형으로 변환해야 계산이나 비교가 가능합니다.
예를 들어 상품 가격은 정수형 int로 처리하면 되고, 할인율이나 환율 같은 값은 소수점이 필요하므로 float로 변환하는 것이 적절합니다.
문자열을 숫자로 변환하는 과정은 파이썬의 내장 함수 int(), float()를 이용해 간단하게 할 수 있습니다.
이 과정에서 콤마(,)나 공백 같은 불필요한 문자는 반드시 제거해줘야 합니다.
그렇지 않으면 ValueError가 발생할 수 있습니다.
price_text = "12,300"
rate_text = "3.75"
# 불필요한 기호 제거
price_clean = price_text.replace(",", "")
rate_clean = rate_text.strip()
# int 변환
price = int(price_clean)
print(price) # 12300
# float 변환
rate = float(rate_clean)
print(rate) # 3.75
숫자를 변환하는 후처리는 데이터 분석 전처리의 핵심 단계입니다.
가격 비교, 합계, 평균 계산 등 모든 수학적 연산이 가능해지며, 정확한 데이터 분석을 위한 기반이 됩니다.
- 🔢정수는 int()로 변환
- 💧소수점이 필요한 값은 float()로 변환
- 🧹콤마, 공백 등 불필요한 문자는 미리 제거
🌍 locale을 이용한 숫자와 통화 처리
웹 데이터를 다룰 때 가장 까다로운 문제 중 하나는 국가와 지역에 따라 다른 숫자와 통화 포맷입니다.
예를 들어, 한국에서는 1,234.56처럼 천 단위마다 콤마를 찍고 소수점을 점(.)으로 표시하지만, 유럽 일부 국가에서는 1.234,56처럼 반대로 표기합니다.
또한 통화 기호도 달라집니다.
이때 파이썬의 locale 모듈을 활용하면 시스템의 지역 설정에 맞게 숫자와 통화를 자동으로 처리할 수 있습니다.
locale을 이용하면 단순히 숫자를 표시하는 것뿐만 아니라, 문자열을 숫자로 파싱할 때도 해당 지역의 규칙을 따를 수 있습니다.
따라서 글로벌 데이터를 다루거나 여러 국가의 쇼핑몰, 금융 데이터를 분석할 때 매우 유용합니다.
import locale
# 한국 로케일 설정
locale.setlocale(locale.LC_ALL, 'ko_KR.UTF-8')
num = 1234567.89
print(locale.format_string("%d", num, grouping=True)) # 1,234,567
# 독일 로케일 설정
locale.setlocale(locale.LC_ALL, 'de_DE.UTF-8')
print(locale.format_string("%.2f", num, grouping=True)) # 1.234.567,89
위 예제처럼 locale을 변경하면 동일한 숫자라도 국가별 표기 방식에 맞게 출력됩니다.
또한 locale.atof()를 사용하면 유럽식 숫자 문자열 “1.234,56”을 올바르게 float 값으로 변환할 수도 있습니다.
💎 핵심 포인트:
다국적 데이터를 다룰 때는 반드시 locale을 활용해야 국가별 숫자와 통화 포맷 차이로 인한 오류를 방지할 수 있습니다.
🪄 strip과 replace로 텍스트 클리닝
데이터를 정리하는 마지막 단계에서는 문자열에 섞여 있는 불필요한 공백, 특수문자, 단위 등을 제거해야 합니다.
파이썬의 문자열 메서드 strip()과 replace()를 적절히 활용하면 이 과정을 단순하고 효과적으로 처리할 수 있습니다.
특히 웹 데이터에는 눈에 보이지 않는 공백 문자나 줄바꿈이 포함되는 경우가 많기 때문에, 이런 전처리 작업은 필수입니다.
예를 들어 가격 데이터가 “₩12,300 원”처럼 불필요한 단위가 붙어 있다면, replace()로 “₩”와 “원”을 제거하고 strip()으로 앞뒤 공백을 정리하면 깔끔한 숫자 문자열을 얻을 수 있습니다.
이후 int()나 float()로 변환하면 바로 계산 가능한 값이 되죠.
text = " ₩12,300 원 "
# 불필요한 문자 제거
cleaned = text.replace("₩", "").replace("원", "").strip()
print(cleaned) # 12,300
# 숫자로 변환
value = int(cleaned.replace(",", ""))
print(value) # 12300
strip()은 문자열의 앞뒤 공백을 제거해주고, replace()는 특정 문자를 원하는 문자로 치환할 수 있습니다.
이 두 가지를 조합하면 다양한 상황에서 데이터 클리닝을 간단하게 처리할 수 있습니다.
💬 정규식으로 패턴을 걸러낸 뒤, strip()과 replace()로 불필요한 기호와 공백을 정리하는 습관을 들이면 데이터 품질을 크게 높일 수 있습니다.
❓ 자주 묻는 질문 (FAQ)
BeautifulSoup만으로 숫자 추출이 가능한가요?
정규식 패턴은 모든 데이터에 동일하게 적용할 수 있나요?
int와 float 변환 시 에러가 발생하는 이유는 무엇인가요?
locale을 설정하면 모든 숫자 포맷이 자동으로 바뀌나요?
strip과 replace만으로 텍스트 정리가 충분한가요?
날짜 문자열은 어떻게 파싱해야 하나요?
웹 크롤링 후처리를 파이프라인으로 관리하는 이유는 무엇인가요?
데이터 후처리에서 가장 흔한 실수는 무엇인가요?
📝 파이썬 BeautifulSoup 데이터 추출과 후처리의 완성
웹 크롤링은 단순히 HTML에서 텍스트를 가져오는 것만으로 끝나지 않습니다.
데이터를 실제 분석에 활용하려면 숫자와 날짜를 올바른 형식으로 변환하고, 불필요한 기호와 공백을 정리하는 후처리 과정이 반드시 필요합니다.
이번 글에서는 BeautifulSoup로 텍스트를 가져오고, 정규식으로 패턴을 추출한 뒤 int/float 변환, locale 기반 포맷 처리, strip과 replace를 통한 문자열 클리닝까지 전 과정을 살펴보았습니다.
이러한 일련의 과정을 파이프라인처럼 설계해두면, 반복되는 데이터 전처리를 효율적으로 처리할 수 있고, 데이터 품질 역시 안정적으로 유지할 수 있습니다.
특히 글로벌 환경에서 다양한 숫자/날짜 포맷을 다뤄야 하는 경우, locale 모듈을 활용하면 국가별 차이로 인한 오류를 크게 줄일 수 있습니다.
앞으로 크롤링이나 데이터 분석 프로젝트를 진행할 때 이번에 소개한 흐름을 적용하면 훨씬 더 깔끔하고 신뢰할 수 있는 데이터를 다룰 수 있을 것입니다.
🏷️ 관련 태그 : BeautifulSoup, 파이썬정규식, 웹스크래핑, 데이터전처리, 파이썬크롤링, locale, strip, replace, int변환, float변환