BeautifulSoup란 무엇인가?
BeautifulSoup는 파이썬 bs4 모듈에 포함된 클래스로, HTML 또는 XML 문서를 손쉽게 파싱(parsing)하기 위해 만들어진 라이브러리입니다. 웹 페이지에서 원하는 데이터를 추출하는 웹 스크래핑(Web Scraping) 작업에서 가장 널리 쓰이는 필수 도구 중 하나입니다.
bs4 설치하기
BeautifulSoup는 pip 모듈을 통해 매우 간단하게 설치할 수 있습니다. 명령 프롬프트나 터미널에서 아래 명령어만 실행하면 됩니다.
pip install bs4
위 명령어를 실행하면 화면에 다음과 같은 설치 과정이 출력됩니다.
C:\Users\rajesh>pip install bs4 Collecting bs4 Downloading https://files.pythonhosted.org/packages/10/ed/7e8b97591f6f456174139ec089c769f89a94a1a4025fe967691de971f314/bs4-0.0.1.tar.gz Requirement already satisfied: beautifulsoup4 in c:\python\python361\lib\site-packages (from bs4) (4.6.0) Building wheels for collected packages: bs4 Building wheel for bs4 (setup.py) ... done Stored in directory: C:\Users\rajesh\AppData\Local\pip\Cache\wheels\a0\b0\b2\4f80b9456b87abedbc0bf2d52235414c3467d8889be38dd472 Successfully built bs4 Installing collected packages: bs4 Successfully installed bs4-0.0.1
설치가 정상적으로 완료되었는지 확인하려면 같은 터미널에서 파이썬을 실행한 뒤 BeautifulSoup를 임포트해 보면 됩니다.
C:\Users\rajesh>python Python 3.6.1 (v3.6.1:69c0db5, Mar 21 2017, 17:54:52) [MSC v.1900 32 bit (Intel)] on win32 Type "help", "copyright", "credits" or "license" for more information. >>> from bs4 import BeautifulSoup >>>
오류 없이 임포트되었다면 설치가 성공적으로 완료된 것입니다.
예제 1: HTML 문서에서 모든 링크 추출하기
HTML 문서가 있을 때 문서 내의 모든 참조 링크(href)를 수집하고 싶다고 가정해 보겠습니다. 먼저 HTML 문서를 문자열 형태의 변수로 저장합니다.
html_doc='''<a href='www.Tutorialspoint.com'/a> <a href='www.nseindia.com.com'/a> <a href='www.codesdope.com'/a> <a href='www.google.com'/a> <a href='www.facebook.com'/a> <a href='www.wikipedia.org'/a> <a href='www.twitter.com'/a> <a href='www.microsoft.com'/a> <a href='www.github.com'/a> <a href='www.nytimes.com'/a> <a href='www.youtube.com'/a> <a href='www.reddit.com'/a> <a href='www.python.org'/a> <a href='www.stackoverflow.com'/a> <a href='www.amazon.com'/a> <a href='www.linkedin.com'/a>'''
이제 위에서 만든 html_doc 변수를 BeautifulSoup의 초기화 함수에 전달하여 soup 객체를 생성합니다.
from bs4 import BeautifulSoup soup = BeautifulSoup(html_doc, 'html.parser')
soup 객체가 준비되었으므로, BeautifulSoup 클래스의 다양한 메서드를 적용할 수 있습니다. 문서 내 태그의 속성과 값을 자유롭게 조회할 수 있습니다.
for tag in soup.find_all('a'):
print(tag.get('href'))위 코드는 반복문을 통해 html_doc 문자열 안의 모든 <a> 태그를 순회하면서 각 태그의 href 속성값을 가져오는 방식으로 동작합니다.
다음은 html_doc 문자열에서 모든 링크를 추출하는 완전한 코드입니다.
from bs4 import BeautifulSoup
html_doc='''<a href='www.Tutorialspoint.com'/a>
<a href='www.nseindia.com.com'/a>
<a href='www.codesdope.com'/a>
<a href='www.google.com'/a>
<a href='www.facebook.com'/a>
<a href='www.wikipedia.org'/a>
<a href='www.twitter.com'/a>
<a href='www.microsoft.com'/a>
<a href='www.github.com'/a>
<a href='www.nytimes.com'/a>
<a href='www.youtube.com'/a>
<a href='www.reddit.com'/a>
<a href='www.python.org'/a>
<a href='www.stackoverflow.com'/a>
<a href='www.amazon.com'/a>
<a href='www.rediff.com'/a>'''
soup = BeautifulSoup(html_doc, 'html.parser')
for tag in soup.find_all('a'):
print(tag.get('href'))실행 결과
www.Tutorialspoint.com www.nseindia.com.com www.codesdope.com www.google.com www.facebook.com www.wikipedia.org www.twitter.com www.microsoft.com www.github.com www.nytimes.com www.youtube.com www.reddit.com www.python.org www.stackoverflow.com www.amazon.com www.rediff.com
예제 2: 특정 키워드가 포함된 링크만 추출하기
실제 웹사이트에서 링크 안에 특정 단어(예: python)가 포함된 URL만 골라서 출력하는 방법을 살펴보겠습니다. 아래 프로그램은 지정한 웹사이트의 모든 URL 중 링크 주소에 "python"이라는 문자열이 들어간 것들만 걸러내어 출력합니다.
from bs4 import BeautifulSoup
from urllib.request import urlopen
import re
html = urlopen("https://www.python.org")
content = html.read()
soup = BeautifulSoup(content)
for a in soup.findAll('a', href=True):
if re.findall('python', a['href']):
print("Python URL:", a['href'])동작 원리
이 코드는 세 단계로 구성됩니다. 첫째, urlopen()으로 python.org 웹페이지의 HTML을 가져옵니다. 둘째, BeautifulSoup로 해당 내용을 파싱한 뒤 href 속성을 가진 모든 <a> 태그를 찾습니다. 셋째, 정규표현식 모듈인 re를 활용해 링크 주소에 'python'이 포함된 경우만 화면에 출력합니다.
실행 결과
Python URL: https://docs.python.org Python URL: https://pypi.python.org/ Python URL: https://www.facebook.com/pythonlang?fref=ts Python URL: https://brochure.getpython.info/ Python URL: https://docs.python.org/3/license.html Python URL: https://wiki.python.org/moin/BeginnersGuide Python URL: https://devguide.python.org/ Python URL: https://docs.python.org/faq/ Python URL: https://wiki.python.org/moin/Languages Python URL: https://python.org/dev/peps/ Python URL: https://wiki.python.org/moin/PythonBooks Python URL: https://wiki.python.org/moin/ Python URL: https://www.python.org/psf/codeofconduct/ Python URL: https://planetpython.org/ Python URL: /events/python-events Python URL: /events/python-user-group/ Python URL: /events/python-events/past/ Python URL: /events/python-user-group/past/ Python URL: /downloads/release/python-373/ Python URL: //jobs.python.org Python URL: https://blog.python.org Python URL: https://wiki.python.org/moin/TkInter Python URL: https://www.wxpython.org/ Python URL: https://ipython.org Python URL: #python-network ...
마무리
지금까지 BeautifulSoup를 설치하고, HTML 문자열에서 링크를 추출하는 기본 예제와 실제 웹사이트에서 조건에 맞는 URL을 수집하는 응용 예제를 살펴보았습니다. find_all(), findAll() 메서드와 정규표현식을 조합하면 원하는 데이터만 정확하게 걸러낼 수 있습니다. 여기에 requests 라이브러리, Selenium 등을 함께 활용하면 더욱 강력한 웹 스크래핑 시스템을 구축할 수 있습니다.