본문 바로가기
HTML & CSS

BeautifulSoup 패키지를 이용해서 HTML 내용 가져오기

by ★√★ 2021. 2. 13.

안녕하세요, Davey 입니다. 오늘 포스팅할 내용은 웹 크롤링에서 정말 중요한 패키지인 BeautifulSoup를 이용하여, HTML 내용을 가져오는 방법에 대한 것입니다. 이전에 request 패키지는 그 웹페이지를 호출하여, 호출한 그 페이지의 내용을 가져오는 것이라면,  BeautifulSoup는 그 가져온 내용에서 우리가 원하는 내용을 추려서, 출력하는 패키지라고 생각하시면 됩니다. 그럼 BeautifulSoup에 대한 정의를 먼저 설명 드리면서 포스팅 시작하도록 하겠습니다. 

1. BeautifulSoup 패키지

: 뷰티플 수프는 HTML과 XML 문서를 파싱하기위한 파이썬 패키지입니다. 웹 스크래핑에 유용한 HTML에서 데이터를 추출하는 데 사용할 수있는 구문 분석 된 페이지에 대한 구문 분석 트리를 생성합니다. 즉, HTML의 내용 가운데 우리가 원하는 항목에 대한 출력을 하는 파이썬 패키지라고 생각하시면 됩니다. 제가 사용해보면서도 놀랄 정도로, 엄청 좋은 파이썬 패키지라고 생각합니다.

 

2. BeautifulSoup 패키지 설치하기 

: BeautifulSoup 패키지를 사용하기 위해서 아래와 같이 BeautifulSoup 패키지를 설치를 하셔야 합니다. 설치 구문은 아래와 같습니다.

 

 - pip install bs4 [Anaconda 패키지 설치 메뉴에서도 설치가 가능합니다.]

 

 - 설치가 완료가 되면 아래와 같은 문구가 나오게 됩니다. 이 내용을 보시면 정상적으로 BeautifulSoup 패키지 설치가 되었다라고 생각하시면 됩니다.

 

 

3. BeautifulSoup 패키지 이용하기 위해서, HTML 내용 구축

: 일단 BeautifulSoup 패키지 이용하려면, TEST HTML File을 만들어야 합니다. HTML 파일을 만드는 방법은 여러가지가 있는데, 저는 그냥 변수에 string 식의 내용으로  TEST HTML 내용을 구현해보도록 하겠습니다. 아래와 같이, <head> 부터 구현하여, <div> 구문을 2개써서, TEST HTML 내용을 구현 하였습니다. 원활한 테스트를 위해서 아래 class 와 id 에 대한 내용도 기재하였습니다.

 

=================================================================================

<html>

 

<head>

 <title> TEST HTML File </title>

 </head>

 <body>

 

 <div id = 'first_id' class='test_class01' contents='test_contents01'>

 

  <h1> 'test_header1' </h1>

  <p1> 'test_contents1' </p1>

 

 </div>

 

  <div id = 'second_id' class='test_class02' contents='test_contents02'>

 

   <h2> 'test_header2' </h2>

   <p2> 'test_contents2' </p2>

 

   </div>

 

 </body>

 </html>

 

=================================================================================


4. BeautifulSoup 패키지 이용하여, HTML 내용 출력 코드 구현

: 이제 HTML 문서를 구축해놨다면 (보통 기존에 만들어진 HTML 문서를 이용할 거라고 예상) 그 문서 안에 있는 내용을 추출하는 코드를 구현해야 합니다. 일단 패키지가 들어 있는 bs4 의 라이브러리를 선언합니다. 

=================================================================================

from bs4 import BeautifulSoup  # bs4 설치 후, 패키지를 사용하기 위해서 선언


=================================================================================

- 그리고 나서 위에 만들어 놓은HTML을 변수 처리하는 코드를 삽입 및 BeautifulSoup 모듈을 이용할 수 있는 변수를 선언해줍니다. "'''" 로 구문으로 묶어 준 것은, 여러 문장들을  한 꺼번에 묶기 위해서 사용했다라고 이해하시면 됩니다.

test_html = '''



<html>

 

<head>

 <title> TEST HTML File </title>

 </head>

 <body>

 

 <div id = 'first_id' class='test_class01' contents='test_contents01'>

 

  <h1> 'test_header1' </h1>

  <p1> 'test_contents1' </p1>

 

 </div>

 

  <div id = 'second_id' class='test_class02' contents='test_contents02'>

 

   <h2> 'test_header2' </h2>

   <p2> 'test_contents2' </p2>

 

   </div>

 

 </body>

 </html>'''

- 확인 차 print 함수로 출력해보면 아래와 같이 나옵니다. 그럼 이제 구현 할 수 있는 준비다 다 되었으니까 하나 하나 구현해보도록 하겠습니다.

 

 

5. find, find_all, get_text, attrs 함수 사용하기

: BeautifulSoup 함수 중에 크롤링을 위해서 가장 많이 쓰이고 대표적은 것은, find, find_all, get_text, attribute 네개로 정리 할 수 있습니다. 하나 하나 설명 드리도록 하겠습니다. 

1) find 함수
: htmal 문서에 그룹 이름을 가지고 내용을 추출할 수 있는 기능입니다. 아래와 같이 예시 코드를 통해서 설명 드리도록 하겠습니다.

=================================================================================

# test_1 로 BeautifualSoup를 이용하여, 원하는 Data를 추출할 html 문서와 연결 시킴.

test_1 = BeautifulSoup(test_html, 'html.parser')



# 조건에 해당하는 한 개의 값을 출력

result1 = test_1.find('div') 

=================================================================================

 

- 위 코드를 실행 시켜보면, 아래와 같은 결과 값을 보실 수 있습니다. 즉, 첫번째 <div> ~ </div> 항목이 추출이 되는 것을 확인 할 수 있습니다. 만약에 2개 있는 경우에는 첫 번째 속성값을 출력합니다.

 


2. find_all 함수
: find 는 그룹명을 가지고 하나만 출력하는 함수 라면, find_all은 해당하는 그룹명을 가진 모든 내용을 다 출력을 하는 함수 입니다. 아래와 같이 예시 코드를 통해서 설명 드리도록 하겠습니다.

# test_1 로 BeautifualSoup를 이용하여, 원하는 Data를 추출할 html 문서와 연결 시킴.

test_1 = BeautifulSoup(test_html, 'html.parser')



# 조건에 해당하는 모든 값을 출력

result1 = test_1.find_all('div')

 

- 위 코드를 실행 시켜보면, 아래와 같은 결과 값을 보실 수 있습니다. 즉, 모든 <div> ~ </div> 항목이 추출이 되는 것을 확인 할 수 있습니다. 그리고, 이 항목들이 LIST 형식으로 추출이 되는 것도 확인 하실 수 있습니다.

 

 

 3) get_text 함수

: 1, 2번 항목은 그룹명 안에 있는 모든 Data를 출력하는 것이라면, get_text는 그 안에 원하는 속성값을 개별적으로 출력하게 하는 함수 입니다. 예를 들어, "<h1> 'test_header1' </h1>" 항목에 있는 'test_header1'라는 값을 출력하고 싶으면 아래와 같이 구현하시면 됩니다.

test_1 = BeautifulSoup(test_html, 'html.parser')
result1 = test_1.find('h1')
result2 = result1.get_text() # <h1> ~</h1> 안에 있는 속성 값을 출력
print(result2)

 

 

 4) attrs 함수

 : 원하는 Data를 찾는 조건을 여러개일 경우에, dictation form으로 구성하고, 이 구성한 조건 값을 기준으로, Data를 출력하는 함수입니다.  두 개의 <div> ~ </div> 항목 중에 id = 'first_id' class='test_class01' 의 조건 값을 가지는 Data를 출력하는 예시로 들어 코드를 구현해보도록 하겠습니다.

 

test_condiction = { 'id' : 'first_id', 'class' : 'test_class01' } # Dictionary으로 한 개이상의 조건 값을 선언

test_1 = BeautifulSoup(test_html, 'html.parser')

result1 = test_1.find('div', attrs = test_condiction) # 선언한 조건 값을 기준으로 출력

print(result1)

- 위 코드를 실행 시켜 보면 아래와 같인 원하는 조건 값에 해당하는 속성 값이 출력 되는 걸 확인 하실 수 있습니다. 이런 과정을 통해서, html 파일에 있는 모든 내용을 가져오는 게 아니고, 원하는 속성 값만 선별적으로 출력할 수 있습니다.

 

 이상입니다. 크롤링의 예제를 통해서 만들 때는 이 부분도 이해는 하고 있었는데, 좀 더 심오하게 들어가니까, find, find_all 등의 차이점을 인지할 수 있게 되는 거 같습니다. 혹시 파이썬(python) 공부하시다가, 저 처럼 그냥 그려러니 하고 넘어간 부분이 있다면, 이번에 공부하고 가시는 게 좋을 거 같습니다. 애매하다고 생각하는 부분은 언젠가는 발목을 잡더라구요;; 그럼 이만 마무리 하도록 하겠습니다. 그럼 항상 애기하지만, 같이 공부하고, 같이 성장하시죠! 감사합니다.

 

제 Posting이 조금이나마 정보 전달에 도움이 되셨길 빌며, 되셨다면, 구독, 댓글, 공감 3종 세트 부탁 드립니다. 감사합니다. 

[저작권이나, 권리를 침해한 사항이 있으면 언제든지 Comment 부탁 드립니다. 검토 후 수정 및 삭제 조치 하도록 하겠습니다. 그리고, 기재되는 내용은 개인적으로 습득한 내용이므로, 혹 오류가 발생할 수 있을 가능성이 있으므로, 기재된 내용은 참조용으로만 봐주시길 바랍니다. 게시물에, 오류가 있을때도, Comment 달아 주시면, 검증 결과를 통해, 수정하도록 하겠습니다.] 

 

728x90

댓글


// 내부링크를 현재창으로 열기 // Open internal links in same tab