
안녕하세요 펭귄 교수입니다.
저번 시간, 웹과 파이썬 requests 편에 이어서 Beautiful soup 강의를 시작하겠습니다.
이전에 requests 편을 보시지 않았다면 보시는 것을 추천드립니다.
[파이썬 코딩 강의] 웹과 파이썬 (requests 편)
안녕하세요 펭귄 교수입니다. 이번에는 웹과 파이썬 강의 시간입니다.웹 파트는 총 3가지 라이브러리로 나누어 설명하고자 합니다. HTTP 프로토콜을 이용하여 데이터를 가져오는 requests,웹 크롤
csexy-1365.tistory.com
1. Beautiful Soup이란?
Beautiful Soup은 HTML과 XML 파일들을 파싱하기 위한 파이썬 라이브러리입니다.

Beautiful Soup 3는 2020년 12월 31일 서비스가 종료되었기 때문에, 이후 라이브러리를 사용한 프로그램, 프로젝트는 Beautiful Soup 4로 이용해야 합니다.
HTML, XML 파일의 파싱이 필요한 이유는 해당 데이터들은 대부분 태그로 둘러쌓여있고, 우리는 정확히 태그로 둘러싸여 있는 그 데이터가 필요하기 때문입니다.
하나 하나 정규식으로 태그를 제거해가며 해당 위치를 찾는 것은 상당히 번거로운 일이기 때문입니다.
그렇기 때문에 DOM 형식으로 이루어진 데이터에서 원하는 위치의 데이터를 정확하게 가져오는 일을 해주는 것이 바로
Beautiful Soup 라이브러리 입니다.

2. 설치
윈도우, MAC
윈도우와 MAC은 pip를 통해 간단하게 설치할 수 있습니다.
pip install beautifulsoup4
우분투, 데비안
우분투와 데비안은 apt-get을 통해 설치해야합니다.
apt-get install python-bs4 # for Python 2
apt-get install python3-bs4 # for Python 3
설치 중 에러가 날 경우
ImportError “No module named HTMLParser”
해당 에러는 파이썬 2.xx에서 파이썬 3.xx의 라이브러리를 설치할 경우입니다.
ImportError “No module named html.parser”
해당 에러는 반대로, 파이썬 3.xx에서 파이썬 2.xx의 라이브러리를 설치한 경우입니다.
3. Parser 종류
Parser | 코드 | 장점 | 단점 |
Python's html.parser | BeautifulSoup(markup, "html.parser") | 1. 내장 기능 2. 준수한 속도 3. 유연한 코드 |
1. lxml 보단 느린 속도 2. html5lib 보다 덜 유연한 코드 |
lxml's HTML parser | BeautifulSoup(markup, "lxml") | 1. 매우 빠른 속도 2. 유연한 코드 |
1. 외부 C 의존성 |
lxml's XML parser | BeautifulSoup(markup, "lxml-xml") BeautifulSoup(markup, "xml") |
1. 매우 빠른 속도 2. 현재 XML 파서만 지원 |
1. 외부 C 의존성 |
html5lib | BeautifulSoup(markup, "html5lib") | 1. 극도로 유연한 코드 2. 웹 브라우저와 같은 방식으로 페이지를 구문 분석 3. 유효한 HTML5 생성 |
1. 매우 느린 속도 2. 외부 파이썬 의존성 |
공식 문서에 따르면, lxml 설치가 가능하다면 lxml 설치하여 해당 파서를 이용하는 것을 권장하고 있습니다.
공식 문서 : https://beautiful-soup-4.readthedocs.io/en/latest/
pip install lxml
lxml 설치
4. 사용법
이전 강의에서 배웠던 requests 와 연동해서 사용합니다.
기본 베이스가 되는 코드를 먼저 보여드리겠습니다.
4-1. 라이브러리 호출
from bs4 import BeautifulSoup
4-2. 베이스 코드
import requests
from bs4 import BeautifulSoup
url = "URL"
with requests.get(url) as response:
# 페이지 정보를 제대로 가져오는 지에 대한 파악
# 이런 사소한 점이 에러를 막습니다.
if response.status_code != 200:
print(response.status_code)
exit()
# 다른 강의들은 html.parser를 많이 사용하지만
# 공식 문서 권장에 따라 lxml parser 형식을 사용합니다.
soup = BeautifulSoup(response.text, "lxml")
4-3. URL
이번에 사용하는 웹 페이지는 직접 만들어서 제작합니다.
VS Code에서 Live Server를 사용하면 서버를 따로 만들지 않아도
로컬 환경의 서버를 하나 만들어서 만든 페이지를 URL 형식으로 불러올 수 있습니다.
Live Server 만드는 방법은 아래 글을 참조해주세요.
[VS Code] 클릭 두 번으로 간단 웹 서버 만들기
안녕하세요 펭귄 교수입니다. 이번에 쓸 포스팅은 VS Code 프로그램에서 클릭 두 번으로 웹 서버를 만드는 방법에 대해 알아보고자 합니다.VS CodeVS Code, Visual Studio Code는 코딩 편집기 중 하나입니
csexy-1365.tistory.com
아래와 같은 HTML 파일을 생성합니다.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<table id="table">
<thead>
<tr>
<td>Head 1</td>
<td>Head 2</td>
<td>Head 3</td>
</tr>
</thead>
<tbody>
<tr>
<td>item 1</td>
<td>item 2</td>
<td>item 3</td>
</tr>
<tr>
<td>item 4</td>
<td>item 5</td>
<td>item 6</td>
</tr>
<tr>
<td>item 7</td>
<td>item 8</td>
<td>item 9</td>
</tr>
</tbody>
</table>
<hr>
<ul id="lists">
<li class="list">list 1</li>
<li class="list">list 2</li>
<li class="list">list 3</li>
<li class="list">list 4</li>
</ul>
</body>
</html>
5. 요소 가져오기
Beautiful Soup 4에서는 요소를 가져오는 방식에는 두 가지 방식이 있습니다.
그것은 find와 select 입니다.
두 방법에 대해서 따로 따로 설명하겠습니다.
5-1. find
find는 기본적으로 태그를 중심으로 요소를 찾습니다. 여기서 태그란 h1, input, ul, li 와 같은 html 태그를 말합니다.
find(name, attr, recursive, string, **kwargs)
# find() 사용
ul = soup.find('ul')
print(ul)

attr 옵션은 기본적으로 find할 때 참조할 class 값입니다. 딕셔너리 형태로 id 값이나 style 등으로도 find가 가능합니다.
li = soup.find('li', 'list') # id로 찾는 경우는 {'id': 'idValue'}
print(li)

하지만 find() 메서드는 하나의 값만 찾습니다.
그래서 여러 개의 값을 찾을 때에는 find_all() 메서드를 사용합니다.
liList = soup.find_all('li') # List 형식으로 반환
for li in liList:
print(li)

5-2. select
select() 메서드는 CSS Selector의 형식으로 요소를 찾습니다.
select() 메서드는 기본적으로 여러 개를 반환합니다.
liList = soup.select('.list')
print(liList)

CSS Selector 방식이기 때문에 더 직관적으로 데이터 크롤링이 가능해집니다.
row = soup.select('thead > tr')
print(row)

리스트 형식이 아닌, 하나의 값만 가져오고 싶을 때는 select_one() 메서드를 사용하면 됩니다.
row = soup.select_one('thead > tr')
print(row)

마무리
크롤링이라는 것은 결국 도구는 생각보다 단순하지만, 어떻게 Select 혹은 Find를 할 지 패턴을 찾는 것이 제일 중요하고 어려운 부분이라고 생각합니다. 그것은 여러 웹 사이트들을 직접 데이터를 보고, 가공하면서 공부하는 것이 제일 빠르게 성장하는 과정일 것입니다.
그리고 크롤링 전에는 해당 사이트에 대한 보안에 따라 되지 않는 경우도 있으니 잘 알아보고 하시는 걸 추천드립니다.
다른 글 더보기
[파이썬 코딩 강의] 웹과 파이썬 (requests 편)
안녕하세요 펭귄 교수입니다. 이번에는 웹과 파이썬 강의 시간입니다.웹 파트는 총 3가지 라이브러리로 나누어 설명하고자 합니다. HTTP 프로토콜을 이용하여 데이터를 가져오는 requests,웹 크롤
csexy-1365.tistory.com
[파이썬 코딩 강의] 클래스와 메서드
안녕하세요 펭귄 교수입니다. 잊혀져 있던 파이썬 코딩 강의를 이어 해보고자 합니다. 이번에야 말로 끝까지 다 써보도록 하겠습니다. 이 커리큘럼을 마친 후에는 심화버전으로 찾아오겠습니
csexy-1365.tistory.com
[파이썬 코딩 강의] 객체 지향 언어
안녕하세요 펭귄 교수입니다. 이번에는 상속(Inheritance), 캡슐화(Encapsulation), 다형성(Polymorphism)과 같은 객체 지향 프로그래밍의 심화 개념을 다루겠습니다. 이 주제들은 소프트웨어 설계에서 매
csexy-1365.tistory.com
'프로그래밍 > Python' 카테고리의 다른 글
[파이썬 코딩 강의] 데이터베이스와 파이썬 : 기본 개념 (0) | 2024.10.16 |
---|---|
[파이썬 코딩 강의] 웹과 파이썬 (Selenium 편) (1) | 2024.10.07 |
[파이썬 코딩 강의] 웹과 파이썬 (requests 편) (0) | 2024.09.28 |
[파이썬 코딩 강의] 객체 지향 언어 (1) | 2024.09.26 |
[파이썬 코딩 강의] 클래스와 메서드 (0) | 2024.09.21 |

안녕하세요 펭귄 교수입니다.
저번 시간, 웹과 파이썬 requests 편에 이어서 Beautiful soup 강의를 시작하겠습니다.
이전에 requests 편을 보시지 않았다면 보시는 것을 추천드립니다.
[파이썬 코딩 강의] 웹과 파이썬 (requests 편)
안녕하세요 펭귄 교수입니다. 이번에는 웹과 파이썬 강의 시간입니다.웹 파트는 총 3가지 라이브러리로 나누어 설명하고자 합니다. HTTP 프로토콜을 이용하여 데이터를 가져오는 requests,웹 크롤
csexy-1365.tistory.com
1. Beautiful Soup이란?
Beautiful Soup은 HTML과 XML 파일들을 파싱하기 위한 파이썬 라이브러리입니다.

Beautiful Soup 3는 2020년 12월 31일 서비스가 종료되었기 때문에, 이후 라이브러리를 사용한 프로그램, 프로젝트는 Beautiful Soup 4로 이용해야 합니다.
HTML, XML 파일의 파싱이 필요한 이유는 해당 데이터들은 대부분 태그로 둘러쌓여있고, 우리는 정확히 태그로 둘러싸여 있는 그 데이터가 필요하기 때문입니다.
하나 하나 정규식으로 태그를 제거해가며 해당 위치를 찾는 것은 상당히 번거로운 일이기 때문입니다.
그렇기 때문에 DOM 형식으로 이루어진 데이터에서 원하는 위치의 데이터를 정확하게 가져오는 일을 해주는 것이 바로
Beautiful Soup 라이브러리 입니다.

2. 설치
윈도우, MAC
윈도우와 MAC은 pip를 통해 간단하게 설치할 수 있습니다.
pip install beautifulsoup4
우분투, 데비안
우분투와 데비안은 apt-get을 통해 설치해야합니다.
apt-get install python-bs4 # for Python 2
apt-get install python3-bs4 # for Python 3
설치 중 에러가 날 경우
ImportError “No module named HTMLParser”
해당 에러는 파이썬 2.xx에서 파이썬 3.xx의 라이브러리를 설치할 경우입니다.
ImportError “No module named html.parser”
해당 에러는 반대로, 파이썬 3.xx에서 파이썬 2.xx의 라이브러리를 설치한 경우입니다.
3. Parser 종류
Parser | 코드 | 장점 | 단점 |
Python's html.parser | BeautifulSoup(markup, "html.parser") | 1. 내장 기능 2. 준수한 속도 3. 유연한 코드 |
1. lxml 보단 느린 속도 2. html5lib 보다 덜 유연한 코드 |
lxml's HTML parser | BeautifulSoup(markup, "lxml") | 1. 매우 빠른 속도 2. 유연한 코드 |
1. 외부 C 의존성 |
lxml's XML parser | BeautifulSoup(markup, "lxml-xml") BeautifulSoup(markup, "xml") |
1. 매우 빠른 속도 2. 현재 XML 파서만 지원 |
1. 외부 C 의존성 |
html5lib | BeautifulSoup(markup, "html5lib") | 1. 극도로 유연한 코드 2. 웹 브라우저와 같은 방식으로 페이지를 구문 분석 3. 유효한 HTML5 생성 |
1. 매우 느린 속도 2. 외부 파이썬 의존성 |
공식 문서에 따르면, lxml 설치가 가능하다면 lxml 설치하여 해당 파서를 이용하는 것을 권장하고 있습니다.
공식 문서 : https://beautiful-soup-4.readthedocs.io/en/latest/
pip install lxml
lxml 설치
4. 사용법
이전 강의에서 배웠던 requests 와 연동해서 사용합니다.
기본 베이스가 되는 코드를 먼저 보여드리겠습니다.
4-1. 라이브러리 호출
from bs4 import BeautifulSoup
4-2. 베이스 코드
import requests
from bs4 import BeautifulSoup
url = "URL"
with requests.get(url) as response:
# 페이지 정보를 제대로 가져오는 지에 대한 파악
# 이런 사소한 점이 에러를 막습니다.
if response.status_code != 200:
print(response.status_code)
exit()
# 다른 강의들은 html.parser를 많이 사용하지만
# 공식 문서 권장에 따라 lxml parser 형식을 사용합니다.
soup = BeautifulSoup(response.text, "lxml")
4-3. URL
이번에 사용하는 웹 페이지는 직접 만들어서 제작합니다.
VS Code에서 Live Server를 사용하면 서버를 따로 만들지 않아도
로컬 환경의 서버를 하나 만들어서 만든 페이지를 URL 형식으로 불러올 수 있습니다.
Live Server 만드는 방법은 아래 글을 참조해주세요.
[VS Code] 클릭 두 번으로 간단 웹 서버 만들기
안녕하세요 펭귄 교수입니다. 이번에 쓸 포스팅은 VS Code 프로그램에서 클릭 두 번으로 웹 서버를 만드는 방법에 대해 알아보고자 합니다.VS CodeVS Code, Visual Studio Code는 코딩 편집기 중 하나입니
csexy-1365.tistory.com
아래와 같은 HTML 파일을 생성합니다.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<table id="table">
<thead>
<tr>
<td>Head 1</td>
<td>Head 2</td>
<td>Head 3</td>
</tr>
</thead>
<tbody>
<tr>
<td>item 1</td>
<td>item 2</td>
<td>item 3</td>
</tr>
<tr>
<td>item 4</td>
<td>item 5</td>
<td>item 6</td>
</tr>
<tr>
<td>item 7</td>
<td>item 8</td>
<td>item 9</td>
</tr>
</tbody>
</table>
<hr>
<ul id="lists">
<li class="list">list 1</li>
<li class="list">list 2</li>
<li class="list">list 3</li>
<li class="list">list 4</li>
</ul>
</body>
</html>
5. 요소 가져오기
Beautiful Soup 4에서는 요소를 가져오는 방식에는 두 가지 방식이 있습니다.
그것은 find와 select 입니다.
두 방법에 대해서 따로 따로 설명하겠습니다.
5-1. find
find는 기본적으로 태그를 중심으로 요소를 찾습니다. 여기서 태그란 h1, input, ul, li 와 같은 html 태그를 말합니다.
find(name, attr, recursive, string, **kwargs)
# find() 사용
ul = soup.find('ul')
print(ul)

attr 옵션은 기본적으로 find할 때 참조할 class 값입니다. 딕셔너리 형태로 id 값이나 style 등으로도 find가 가능합니다.
li = soup.find('li', 'list') # id로 찾는 경우는 {'id': 'idValue'}
print(li)

하지만 find() 메서드는 하나의 값만 찾습니다.
그래서 여러 개의 값을 찾을 때에는 find_all() 메서드를 사용합니다.
liList = soup.find_all('li') # List 형식으로 반환
for li in liList:
print(li)

5-2. select
select() 메서드는 CSS Selector의 형식으로 요소를 찾습니다.
select() 메서드는 기본적으로 여러 개를 반환합니다.
liList = soup.select('.list')
print(liList)

CSS Selector 방식이기 때문에 더 직관적으로 데이터 크롤링이 가능해집니다.
row = soup.select('thead > tr')
print(row)

리스트 형식이 아닌, 하나의 값만 가져오고 싶을 때는 select_one() 메서드를 사용하면 됩니다.
row = soup.select_one('thead > tr')
print(row)

마무리
크롤링이라는 것은 결국 도구는 생각보다 단순하지만, 어떻게 Select 혹은 Find를 할 지 패턴을 찾는 것이 제일 중요하고 어려운 부분이라고 생각합니다. 그것은 여러 웹 사이트들을 직접 데이터를 보고, 가공하면서 공부하는 것이 제일 빠르게 성장하는 과정일 것입니다.
그리고 크롤링 전에는 해당 사이트에 대한 보안에 따라 되지 않는 경우도 있으니 잘 알아보고 하시는 걸 추천드립니다.
다른 글 더보기
[파이썬 코딩 강의] 웹과 파이썬 (requests 편)
안녕하세요 펭귄 교수입니다. 이번에는 웹과 파이썬 강의 시간입니다.웹 파트는 총 3가지 라이브러리로 나누어 설명하고자 합니다. HTTP 프로토콜을 이용하여 데이터를 가져오는 requests,웹 크롤
csexy-1365.tistory.com
[파이썬 코딩 강의] 클래스와 메서드
안녕하세요 펭귄 교수입니다. 잊혀져 있던 파이썬 코딩 강의를 이어 해보고자 합니다. 이번에야 말로 끝까지 다 써보도록 하겠습니다. 이 커리큘럼을 마친 후에는 심화버전으로 찾아오겠습니
csexy-1365.tistory.com
[파이썬 코딩 강의] 객체 지향 언어
안녕하세요 펭귄 교수입니다. 이번에는 상속(Inheritance), 캡슐화(Encapsulation), 다형성(Polymorphism)과 같은 객체 지향 프로그래밍의 심화 개념을 다루겠습니다. 이 주제들은 소프트웨어 설계에서 매
csexy-1365.tistory.com
'프로그래밍 > Python' 카테고리의 다른 글
[파이썬 코딩 강의] 데이터베이스와 파이썬 : 기본 개념 (0) | 2024.10.16 |
---|---|
[파이썬 코딩 강의] 웹과 파이썬 (Selenium 편) (1) | 2024.10.07 |
[파이썬 코딩 강의] 웹과 파이썬 (requests 편) (0) | 2024.09.28 |
[파이썬 코딩 강의] 객체 지향 언어 (1) | 2024.09.26 |
[파이썬 코딩 강의] 클래스와 메서드 (0) | 2024.09.21 |