먼저 링크를 첨부한다.
https://www.crummy.com/software/BeautifulSoup/
Beautiful Soup: We called him Tortoise because he taught us.
www.crummy.com
https://www.crummy.com/software/BeautifulSoup/bs4/doc.ko/
뷰티플수프 문서 — 뷰티플수프 4.0.0 문서
find_all() 메쏘드는 태그의 후손들을 찾아서 지정한 여과기에 부합하면 모두 추출한다. 몇 가지 여과기에서 예제들을 제시했지만, 여기에 몇 가지 더 보여주겠다: 어떤 것은 익숙하지만, 다른 것
www.crummy.com
BeutifulSoup?
뷰티풀수프? 아름다운 수프란 무엇일까. 공식 홈페이지의 문서를 참고해 보면 아래의 설명이 적혀있는 것을 볼 수 있다.
뷰티플수프는 HTML과 XML 파일로부터 데이터를 뽑아내기 위한 파이썬 라이브러리이다. 여러분이 선호하는 해석기와 함께 사용하여 일반적인 방식으로 해석 트리를 항해, 검색, 변경할 수 있다. 주로 프로그래머의 수고를 덜어준다.
결론적으로 보면 HTML과 XML코드를 긁어와서 태그 기반으로 트리를 만들어 어떤 데이터가 있는지 검색하고 변경을 거칠 수 있는 것으로 보인다. (이론적으로 이해는 하나 필자는 실제로 쓸 일이 있지 않았어서 아직 무슨 용도로 쓰이는지 정확히 체감이 되지 않아 실제 사용하는 것을 보고 공부를 해보고자 한다)
How to use?
1. 먼저 위에 링크첨부한 곳에 있는 곳에서 Download 부분을 참고하여 설치를 진행하자. 아래와 같은 명령어를 cmd창에 입력하여 설치
pip install beautifulsoup4
2. 테스트로 사용해볼 html 파일과 코드를 만들어둔다. (필자는 공식 사이트에 있는 내용을 참고하여 사용하였다)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>The Dormouse's story</title>
</head>
<body>
<p class="title"><b>The Dormouse's story</b></p>
<p class="story">Once upon a time there were three little sisters; and their names were
<a href="http://example.com/elsie" class="sister" id="link1">Elsie</a>,
<a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and
<a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>;
and they lived at the bottom of a well.</p>
</body>
</html>
3. 이제 실제 사용을 파이썬 코드를 통해 알아본다. 아래처럼 main.py를 만들고 아래처럼 입력을 해보자
from bs4 import BeautifulSoup
with open("test.html") as file:
contents = file.read()
soup = BeautifulSoup(contents, "html.parser")
+ 추가로 xml과 같은 형태를 사용하기 위해서는 parser를 바꿔주어야 하는 경우가 생기는데 lxml 설치가 필요할 수 있다. (아래처럼 해서 lxml을 설치하고 import lxml을 하고 parser를 아래처럼 lxml으로 바꿔야 할 수 있다.
pip install lxml
4. 이제 모든 준비는 끝났으니 마음껏 사용해보기로 한다.
Practice
간단히 BeutifulSoup 객체를 사용해서 내용을 가져오면 된다. 아래의 코드와 주석을 보고 사용법을 알 수 있다.
from bs4 import BeautifulSoup
# 필요한 경우 import
# import lxml
with open("test.html") as file:
contents = file.read()
soup = BeautifulSoup(contents, "html.parser")
# 타이틀 태그와 내용 포함 출력
print(soup.title)
# 타이틀 태그의 이름 (title 출력)
print(soup.title.name)
# 타이틀 문구의 내용
print(soup.title.string)
# HTML 전체 출력
print(soup)
# HTML 전체 출력 + 적절하게 들여쓰기까지 포함
print(soup.prettify())
# 첫번째 a, li, p 태그 가져오기
print(soup.a)
print(soup.li)
print(soup.p)
일단 간단하게 사용 방법을 알아보았고 더 자세하게는 위 링크의 문서를 참고하거나 해서 더 알아볼 수 있다.
간단한 사용방법은 알아보았지만 아직 실용적으로 어떻게 쓰일 수 있을지에 대해선 알기 어렵다고 생각이 든다. 실제로 유용하게 사용을 하기 위해선 전체 목록을 긁어서 가져오거나 하는 것들이 더 유용할 것이기 때문..
그래서 이제 정말 필요한 내용을 사용해보기 위해서 첫번째 태그만 가져오는 것이 아닌 모든 태그를 가져오는 방법도 추가로 알아보고자 한다.
find_all()
특정 태그 이름을 가지고 모든 목록을 찾아오는 것으로 아래처럼 find_all(name="태그 이름")을 사용가능하
# 특정 태그 name인 것들을 전부 찾아옴
print(soup.find_all(name="a"))
추가로 해당 태그의 내용만 가져와서 출력하는 방법은 간단히 해당 목록을 for문을 돌린 후 getText를 해서 가져올 수 있다
# 특정 태그 name인 것들을 전부 찾아옴
all_a_tags = soup.find_all(name="a")
for tag in all_a_tags:
# a 태그의 내용만 가져와서 출력
print(tag.getText())
# a 태그의 href 설정된 값을 가져오는 방법 (a 태그여서 링크 주소)
print(tag.get("href"))
추가로 특정 태그이면서 id나 class를 지정해서 가져오는 방법도 있다.
# 추가로 특정 태그 & 특정 id인 것을 가져오는 방법
name_test = soup.find(name="p", id="name")
# 특정 태그 & 클래스 이름 가져오기 (클래스는 기존에 이미 정의되어있는 키워드이기 때문에 _를 붙여서 쓴다)
class_test = soup.find(name="a", class_="sister")
그리고 보통의 웹사이트라면 더욱 복잡하게 태그가 되어 있을 것이기 때문에 이를 좀 더 깊게 찾는 방법을 알아보자
# 특정 태그를 더욱 깊이 찾을 때 사용되는 것으로, 하나인 경우 select_one이고 여러개를 찾을 때 select를 쓴다
# id를 찾는 경우 #을 붙이고 이름을 쓰면 된다.
# 추가로 class를 찾는 경우 select로 호출 후 . 뒤에 이름을 붙인다.
p_b_tag = soup.select_one(selector="p b")
print(p_b_tag)
title_tag = soup.select_one(selector="#link1")
print(title_tag)
link_list = soup.select(".sister")
print(link_list)
'Devs > Python' 카테고리의 다른 글
[Python] HTTP Requests (0) | 2025.04.14 |
---|---|
[Python] Environment Variables (0) | 2025.04.11 |
[Python] Dynamic Typing, Type Hint (0) | 2025.04.10 |
[Python] Unescape (HTML 특수문자 처리) (0) | 2025.04.10 |
[Python] API (1) | 2025.04.09 |