Python - Beautifulsoup 사용 법 및 예제

컴퓨터/Python

728x90
반응형

서론

Python의 라이브러리 패키지인 BeautifulSoup은 Python에서 이용하여 HTML, XML 등의 문서를 손쉽게 활용할 수 있도록 도와줍니다.

HTML, XML 등의 문서를 Python에서 탐색, 삽입, 수정, 추출 등을 할 수 있는 기능이 있습니다. 

다양한 분야에서 활용할 수 있으며, requests, selenium를 이용하거나 직접 HTML을 가지고 와서 Python내에서 동작할 때 아주 효과적입니다. (물론 직접 구현아는 것이 구동 속도는 빠를 수 있습니다.)

 

본문에서는 BeautifulSoup에 대하여 전반적인 내용을 살펴보고 HTML을 다루는 방법에 대해서 알아보도록 하겠습니다.

Web 크롤링을 위해서 사용하기 위한 태그들을 검색하고 추출하는 방법만을 다루도록 하겠습니다.

더 자세한 내용은 공식 웹사이트를 방문하세요.

설치

Python 기본 패키지가 아니기 때문에 pip를 통한 설치 또는 다양한 방법으로 BeautifulSoup을 설치해주어야 합니다.

pip install beautifulsoup4

시작 - BeautifulSoup() 호출

BeautisulSoup함수를 호출하면서 외부에서 가지고 온 문자열의 형태로 구성된 HTML 문서를 Python에서 손쉽게 이용할 수 있습니다.

 

본문에서는 아래와 같은 HTML 문서가 문자열의 형태로 저장되어 있다고 가정하고 시작하겠습니다.

HTMLdata = '''
<!DOCTYPE html>
<html lang="ko">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>레이아웃 연습</title>
</head>
<body>
  <header id="main_header">
      <div id="title">
          <h1>Rint Development</h1>
          <h2>HTML5 + CSS3 Basic</h2>
      </div>
      <nav id="main_gnb">
          <ul>
              <li><a href="#">Web</a></li>
              <li><a href="#">Mobile</a></li>
              <li><a href="#">Game</a></li>
              <li><a href="#">Simulation</a></li>
              <li><a href="#">Data</a></li>
          </ul>
      </nav>
      <nav id="main_lnb">
          <ul>
              <li><a href="#">HTML5</a></li>
              <li><a href="#">CSS3</a></li>
              <li><a href="#">JavaScript</a></li>
              <li><a href="#">jQuery</a></li>
              <li><a href="#">Node.js</a></li>
          </ul>
      </nav>
  </header>
  <div id="content">
      <section id="main_section">
          <article class="main_article">
              <h1>Main Article</h1>
              <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur in magna libero. Sed nec pharetra nunc. Proin eget magna id ipsum eleifend cursus sit amet nec lectus. Nunc quis lacus magna. Aliquam blandit, sapien ut viverra fermentum, elit tortor ornare nisi, in luctus sem massa pulvinar turpis. Cras tincidunt dictum urna ut ultricies. Nullam diam nibh, pellentesque non laoreet ut, bibendum nec mauris. Maecenas pulvinar porttitor laoreet. Vivamus bibendum purus nisl, eget aliquam lectus. Maecenas justo libero, euismod sit amet suscipit eu, vulputate eget neque. Aliquam quam est, blandit nec iaculis non, suscipit vel nunc. Proin et odio aliquam erat pharetra accumsan et quis neque. Vivamus interdum accumsan leo eu adipiscing. Integer accumsan elit non turpis faucibus porttitor. Aliquam scelerisque nisi et turpis pretium at ultricies turpis pharetra.</p>
          </article>
          <article class="main_article">
              <h1>Main Article</h1>
              <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur in magna libero. Sed nec pharetra nunc. Proin eget magna id ipsum eleifend cursus sit amet nec lectus. Nunc quis lacus magna. Aliquam blandit, sapien ut viverra fermentum, elit tortor ornare nisi, in luctus sem massa pulvinar turpis. Cras tincidunt dictum urna ut ultricies. Nullam diam nibh, pellentesque non laoreet ut, bibendum nec mauris. Maecenas pulvinar porttitor laoreet. Vivamus bibendum purus nisl, eget aliquam lectus. Maecenas justo libero, euismod sit amet suscipit eu, vulputate eget neque. Aliquam quam est, blandit nec iaculis non, suscipit vel nunc. Proin et odio aliquam erat pharetra accumsan et quis neque. Vivamus interdum accumsan leo eu adipiscing. Integer accumsan elit non turpis faucibus porttitor. Aliquam scelerisque nisi et turpis pretium at ultricies turpis pharetra.</p>
          </article>
          <article class="main_article">
              <h1>Main Article</h1>
              <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur in magna libero. Sed nec pharetra nunc. Proin eget magna id ipsum eleifend cursus sit amet nec lectus. Nunc quis lacus magna. Aliquam blandit, sapien ut viverra fermentum, elit tortor ornare nisi, in luctus sem massa pulvinar turpis. Cras tincidunt dictum urna ut ultricies. Nullam diam nibh, pellentesque non laoreet ut, bibendum nec mauris. Maecenas pulvinar porttitor laoreet. Vivamus bibendum purus nisl, eget aliquam lectus. Maecenas justo libero, euismod sit amet suscipit eu, vulputate eget neque. Aliquam quam est, blandit nec iaculis non, suscipit vel nunc. Proin et odio aliquam erat pharetra accumsan et quis neque. Vivamus interdum accumsan leo eu adipiscing. Integer accumsan elit non turpis faucibus porttitor. Aliquam scelerisque nisi et turpis pretium at ultricies turpis pharetra.</p>
          </article>
      </section>
      <aside id="main_aside">
          <input id="first" type="radio" name="tab" checked="checked" />
          <input id="second" type="radio" name="tab" />
          <section class="buttons">
              <label for="first">First</label>
              <label for="second">Second</label>
          </section>
          <div class="tab_item">
              <ul>
                  <li class="item"><a href="#">
                      <div class="thumbnail">
                          <img src="http://placehold.it/45x45" />
                      </div>
                      <div class="description">
                          <strong>HTML5 Canvas</strong><p>2012-03-15</p>
                      </div>
                  </a></li>
                  <li class="item"><a href="#">
                      <div class="thumbnail">
                          <img src="http://placehold.it/45x45" />
                      </div>
                      <div class="description">
                          <strong>HTML5 Audio</strong><p>2012-03-15</p>
                      </div>
                  </a></li>
                  <li class="item"><a href="#">
                      <div class="thumbnail">
                          <img src="http://placehold.it/45x45" />
                      </div>
                      <div class="description">
                          <strong>HTML5 Video</strong><p>2012-03-15</p>
                      </div>
                  </a></li>
                  <li class="item"><a href="#">
                      <div class="thumbnail">
                          <img src="http://placehold.it/45x45" />
                      </div>
                      <div class="description">
                          <strong>HTML5 Semantic Web</strong><p>2012-03-15</p>
                      </div>
                  </a></li>
              </ul>
          </div>
          <div class="tab_item">
              <ul>
                  <li class="item"><a href="#">
                      <div class="thumbnail">
                          <img src="http://placehold.it/45x45" />
                      </div>
                      <div class="description">
                          <strong>CSS3 Transition</strong><p>2012-03-15</p>
                      </div>
                  </a></li>
                  <li class="item"><a href="#">
                      <div class="thumbnail">
                          <img src="http://placehold.it/45x45" />
                      </div>
                      <div class="description">
                          <strong>CSS3 Animation</strong><p>2012-03-15</p>
                      </div>
                  </a></li>
                  <li class="item"><a href="#">
                      <div class="thumbnail">
                          <img src="http://placehold.it/45x45" />
                      </div>
                      <div class="description">
                          <strong>CSS3 Border</strong><p>2012-03-15</p>
                      </div>
                  </a></li>
                  <li class="item"><a href="#">
                      <div class="thumbnail">
                          <img src="http://placehold.it/45x45" />
                      </div>
                      <div class="description">
                          <strong>CSS3 Box</strong><p>2012-03-15</p>
                      </div>
                  </a></li>
              </ul>
          </div>
      </aside>
  </div>
  <footer id="main_footer">
      <h3>HTML5 + CSS3 Basic</h3>
      <address>Website Layout Basic</address>
  </footer>
</body>
</html>
'''

 

Python에서 문자열의 형태로 가지고 온 HTML 문서를 Beautifulsoup함수를 통해 구조화된 객체의 형태로 변경해 주도록 합시다. 이때 어떤 문서 (HTML, XML 등)을 parser 할 것인지 명시해 주며 호출을 해줍시다.

Soup = Beautifulsoup(HTMLdata,features="html.parser")

이제 HTMLdata에 문자열의 형태로 저장되어 있는 데이터Soup에 Beautifulsoup을 이용한 객체 형태의 데이터로 변환되었습니다.

 

 

print(type(Soup))

BeautifulSoup을 이용하면 객체의 형태로 데이터를 제어합니다. Beautifulsoup에서 사용하게 될 몇 가지 객체의 종류에 대해서 설명하도록 하겠습니다.

 

객체의 종류

객체화된 HTML데이터를 컨트롤하기 위해서 우선 객체가 어떤 식으로 만들어지는지 간단하게 알아보도록 합시다.

 

우선 대표적으로 알아두어야 할 3가지 객체의 종류를 알아봅시다.

  • BeautifulSoup - 최상위 객체 즉, HTML데이터를 객체를 시작하기 위한 시작점
  • Tag - HTML의 태그를 하나씩 구분하기 위한 객체
  • NavigableString - 객체화된 HTML 문서를 탐색하기 위해 도움을 주는 객체

예제에서 만들어진 BeautifulSoup 클래스의 안을 살펴보면 다음과 같이 객체들을 넣어 구조화하고 있습니다.

 

 

위의 그림처럼 계속해서 NavigableString과 Tag로 이루어진 상위 객체에서 하위 객체로 파생되어 가고 있습니다.

이러한 구조를 손쉽게 만들어 주기 때문에, 손쉽게 데이터를 탐색, 추출, 삽입, 수정 등이 가능한 것입니다.

 

주요 속성

BeautifulSoup과 Tag 객체에는 많은 속성들이 존재하고 있습니다. 그중 몇 가지 속성을 알아보도록 합시다.

  • name - 태그의 이름
  • attrs - 태그 안의 속성 값
  • text - 해당 태그 및 하위에 있는 모든 태그의 문자열 데이터 값

예를 들어 예제의 특정 부분을 Tag객체로 받아왔다면 그 구조는 어떻게 되어있나 살펴보도록 하겠습니다.

  <header id="main_header">
      <div id="title">
          <h1>Rint Development</h1>
          <h2>HTML5 + CSS3 Basic</h2>
      </div>
      <nav id="main_gnb">
          <ul>
              <li><a href="#">Web</a></li>
              <li><a href="#">Mobile</a></li>
              <li><a href="#">Game</a></li>
              <li><a href="#">Simulation</a></li>
              <li><a href="#">Data</a></li>
          </ul>
      </nav>
      <nav id="main_lnb">
          <ul>
              <li><a href="#">HTML5</a></li>
              <li><a href="#">CSS3</a></li>
              <li><a href="#">JavaScript</a></li>
              <li><a href="#">jQuery</a></li>
              <li><a href="#">Node.js</a></li>
          </ul>
      </nav>
  </header>
  • name - 'header' (type : str)
  • attrs - {'id':'main_header'} (type : dict)
  • text - '\n\nRint Devlopment\nHTML 5 + CSS3 Basic\n\n\n\n....... Node.js\n\n\n'

text속성의 경우 개행 문자가 삽입되어있는 것을 알 수 있습니다. 이유는 하위 객체들끼리를 구분하기 위한 NavigableString의 문자까지 포함되어 있습니다.

 

당연히 최하위 객체의 text속성에는 개행 문자가 존재하지 않습니다.

 

이제 대표적인 중요 인자들은 알았으니 BeautifulSoup에서 제공하는 방법들을 이용해서 데이터화 된 HTML 문서를 본격적으로 다뤄보도록 합시다.

객체화된 HTML 문서에서 HTML 코드를 추출하기 - prettipy()

Python에서 HTML 코드를 다루기 위해 BeautifulSoup을 이용해서 문자열 HTML 소스코드를 객체화를 시켰습니다.

객체화된 HTML 데이터를 다룬 후 필요한 영역의 데이터를 확인, 또는 HTML의 형태로 추출해야 하는 경우가 있습니다.

이때 prettify()를 호출하여 결과를 확인할 수 있습니다.

 

Beautifulsoup 또는 Tag 객체에서 활용할 수 있습니다.

# BeautifulSoup,Tag 객체 -> 문자열 HTML
# prettify() 태그마다 들여쓰기로 가독성을 가지며 변환
print(Soup.prettify())

추출된 결과물의 일부

위의 결과처럼 가독성의 형태를 유지하기 위해 태그마다 들여 쓰기의 형태의 문자열로 결과를 출력할 수 있습니다.

 

그럼 이제 객체들에서 필요한 영역으로 접근하는 방법에 대해서 알아보도록 합시다.

 

Dot(. )을 통한 태그에 접근하는 방법

HTML 문서를 Python에서 객체화시키면 트리구조의 형태로 만들어집니다.

그리고 Beautifulsoup에서는 간단하게 상위 태그에서 하위 태그로 Dot (. )을 이용해서 접근할 수 있습니다.

# Dot 방식을 통해 하위 태그에 접근하기
html = Soup.html
head = html.head
print(head.prettify())
print(Soup.html.head.prettify())

위의 소스코드처럼 상위 태그로부터 하위 태그로 접근할 수 있습니다.

하지만 이 방법에는 한 가지 문제가 있습니다. 만약 하위 태그에 예제와 같이 동일한 태그명이 존재한다면 어떻게 될까요?

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>레이아웃 연습</title>
</head>

이런 경우에는 가장 처음 만나는 하위 태그를 취하게 됩니다.

#만나는 가장 첫번 째 태그를 가짐
meta = head.meta
print(head.meta.prettify())

가장 손쉽게 태그들에 접근하는 방법이지만, 위와 같은 문제가 발생하는 경우가 있어 사용에 유의해야 됩니다.

 

그렇다면 다른 방법으로 태그들을 가지고 오는 방법에 대해서 알아보도록 합시다.

 

객체에서 검색하기 find_all() / find()

거대한 HTML 문서를 객체화한 후 위와 같은 방법으로 원하는 태그에 접근하기에는 상당히 비 효율적인 면이 많습니다.

그래서 특정한 태그를 검색하기 위해서 2가지 함수를 제공해 줍니다.

  • find_all() - 해당 모든 태그를 추출
  • find() - 가장 먼저 만나는 하나의 태그를 추출

즉, 해당 태그 아래에 속한 모든 태그에 검색한 태그가 있다면 추출합니다.

# 검색하기
a = head.find("meta")
b = head.find_all("meta")
c = html.find("meta")
d = html.find_all("meta")
e = Soup.find("meta")
f = Soup.find_all("meta")

 

하지만 이 방법도 원하는 태그에 접근하기에는 쉽지 않을 수 있습니다.

이때 속성 조건을 선택하여 태그를 검색할 수 있습니다. 

여러 가지 인자를 통해 검색할 수 있는데, 몇 가지 알아보도록 하겠습니다.

  • id - id 속성 값을 통해 검색합니다.
  • class_ - class 속성 값을 통해 검색합니다.
  • attr - 속성을 dict 형태로 검색합니다. 예시 attr = {'charset':'utf-8'} 
#조건 추가해서 검색하기
a = Soup.find(id='title')
b = Soup.find_all(class_ = 'main_article')
c = Soup.find(attrs = {'charset':'utf-8'})

 

검색 조건 제한하기 - 최상단의 하위 태그에서 추출

특정 태그를 추출하는 과정에서 다양한 조건들에 제한을 걸 수도 있습니다.

예를 들어, 데이터 전체에서 특정 태그를 추출하는 것이 아닌 바로 하위 태그에서만 추출하는 경우는 아래처럼 사용하면 됩니다.

#제한 검색하기
#Soup의 바로 아래의 하위태그에서만 검색
a = Soup.find_all("meta",recursive = False) #결과 [] 빈 List
b = Soup.find_all("meta") #Soup안에 존재하는 모든 태그들 중 meta 태그
c = head.find_all("meta",recursive = False) #결과 head태그 바로 아래의 meta 태그들

 

이외에 다양한 방법들이 많이 존재합니다. 하지만 이 정도만 알아도 원하는 태그에 쉽게 접근할 수 있습니다.

이제 접근한 태그에서 다양한 방법으로 필요한 정보를 가지고 오는 방법을 알아봅시다.

 

태그 이름 가지고 오기 -. name

해당 객체에서. name을 이용해서 태그 이름을 가지고 올 수 있습니다.

#태그 이름 가지고오기
print(Soup.find("meta").name)
#find_all의 경우 List이기 때문에 하나씩 꺼내어 가지고 와야됩니다.
for item in Soup.find_all("meta"):
    print(item.name)

 

태그 속성 값 가지고 오기 -. attrs

해당 객체에서. attrs를 이용해서 태그의 속성을 가지고 올 수 있습니다.

dict타입으로 받아옵니다.

#태그 속성 값 가지고오기
a = Soup.find_all("meta")
b = a[2].attrs
print(b)
print(a[2].attrs)

 

태그의 HTML 문자열 가지고 오기 -. string

간단하게 해당 태그를 가지고 올 수 있습니다. 하지만 타입 자체는 변하지 않으니 문자열로서 이용하고 싶다면, 형 변환이 필요합니다.

#태그의 HTML 문자열 가지고오기
a = Soup.find(id='title')
print(a)
print(type(a)) #Tag 객체입니다.

#만약 문자열로 이용하고 싶다면 문자열 변환을 해주어야합니다.
b = str(a)
print(b)
print(type(b))

태그의 Text 가지고 오기 -. get_text()

해당 객체에서. get_text()를 통해 태그 안에 들어있는 값을 가지고 올 수 있습니다. 

다만, 태그 객체들을 구분하기 위한 개행 문자 또한 출력되기 때문에 주의해야 합니다.

옵션을 추가하여 다양한 형태로 추출할 수 있습니다.

#Text 받아오기
a = Soup.find("nav",id='main_gnb')
print(a.get_text())

#옵션을 주어서 개행문자를 제거 또는 특정 규칙으로 나누기
print(a.get_text(strip=True))
print(a.get_text(' ',strip=True))

전체 소스코드 

사실, 좀 더 자세한 내용은 공식 Doc를 참조하시는 게 도움이 됩니다.

다만, 영어가 싫다 또는 최소한의 공부만 하고 싶으면 해당 포스트를 참조하시고 도움이 되었으면 좋겠습니다.

위의 내용만 안다면 BeautifulSoup을 통해 간단한 HTML 데이터를 Python에서 활용하는데 효과적일 것이라고 생각합니다.

이상 전체 실습했던 소스코드 공유하며 포스트를 마치겠습니다.

from bs4 import BeautifulSoup

HTMLdata = '''
<!DOCTYPE html>
<html lang="ko">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>레이아웃 연습</title>
</head>
<body>
  <header id="main_header">
      <div id="title">
          <h1>Rint Development</h1>
          <h2>HTML5 + CSS3 Basic</h2>
      </div>
      <nav id="main_gnb">
          <ul>
              <li><a href="#">Web</a></li>
              <li><a href="#">Mobile</a></li>
              <li><a href="#">Game</a></li>
              <li><a href="#">Simulation</a></li>
              <li><a href="#">Data</a></li>
          </ul>
      </nav>
      <nav id="main_lnb">
          <ul>
              <li><a href="#">HTML5</a></li>
              <li><a href="#">CSS3</a></li>
              <li><a href="#">JavaScript</a></li>
              <li><a href="#">jQuery</a></li>
              <li><a href="#">Node.js</a></li>
          </ul>
      </nav>
  </header>
  <div id="content">
      <section id="main_section">
          <article class="main_article">
              <h1>Main Article</h1>
              <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur in magna libero. Sed nec pharetra nunc. Proin eget magna id ipsum eleifend cursus sit amet nec lectus. Nunc quis lacus magna. Aliquam blandit, sapien ut viverra fermentum, elit tortor ornare nisi, in luctus sem massa pulvinar turpis. Cras tincidunt dictum urna ut ultricies. Nullam diam nibh, pellentesque non laoreet ut, bibendum nec mauris. Maecenas pulvinar porttitor laoreet. Vivamus bibendum purus nisl, eget aliquam lectus. Maecenas justo libero, euismod sit amet suscipit eu, vulputate eget neque. Aliquam quam est, blandit nec iaculis non, suscipit vel nunc. Proin et odio aliquam erat pharetra accumsan et quis neque. Vivamus interdum accumsan leo eu adipiscing. Integer accumsan elit non turpis faucibus porttitor. Aliquam scelerisque nisi et turpis pretium at ultricies turpis pharetra.</p>
          </article>
          <article class="main_article">
              <h1>Main Article</h1>
              <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur in magna libero. Sed nec pharetra nunc. Proin eget magna id ipsum eleifend cursus sit amet nec lectus. Nunc quis lacus magna. Aliquam blandit, sapien ut viverra fermentum, elit tortor ornare nisi, in luctus sem massa pulvinar turpis. Cras tincidunt dictum urna ut ultricies. Nullam diam nibh, pellentesque non laoreet ut, bibendum nec mauris. Maecenas pulvinar porttitor laoreet. Vivamus bibendum purus nisl, eget aliquam lectus. Maecenas justo libero, euismod sit amet suscipit eu, vulputate eget neque. Aliquam quam est, blandit nec iaculis non, suscipit vel nunc. Proin et odio aliquam erat pharetra accumsan et quis neque. Vivamus interdum accumsan leo eu adipiscing. Integer accumsan elit non turpis faucibus porttitor. Aliquam scelerisque nisi et turpis pretium at ultricies turpis pharetra.</p>
          </article>
          <article class="main_article">
              <h1>Main Article</h1>
              <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur in magna libero. Sed nec pharetra nunc. Proin eget magna id ipsum eleifend cursus sit amet nec lectus. Nunc quis lacus magna. Aliquam blandit, sapien ut viverra fermentum, elit tortor ornare nisi, in luctus sem massa pulvinar turpis. Cras tincidunt dictum urna ut ultricies. Nullam diam nibh, pellentesque non laoreet ut, bibendum nec mauris. Maecenas pulvinar porttitor laoreet. Vivamus bibendum purus nisl, eget aliquam lectus. Maecenas justo libero, euismod sit amet suscipit eu, vulputate eget neque. Aliquam quam est, blandit nec iaculis non, suscipit vel nunc. Proin et odio aliquam erat pharetra accumsan et quis neque. Vivamus interdum accumsan leo eu adipiscing. Integer accumsan elit non turpis faucibus porttitor. Aliquam scelerisque nisi et turpis pretium at ultricies turpis pharetra.</p>
          </article>
      </section>
      <aside id="main_aside">
          <input id="first" type="radio" name="tab" checked="checked" />
          <input id="second" type="radio" name="tab" />
          <section class="buttons">
              <label for="first">First</label>
              <label for="second">Second</label>
          </section>
          <div class="tab_item">
              <ul>
                  <li class="item"><a href="#">
                      <div class="thumbnail">
                          <img src="http://placehold.it/45x45" />
                      </div>
                      <div class="description">
                          <strong>HTML5 Canvas</strong><p>2012-03-15</p>
                      </div>
                  </a></li>
                  <li class="item"><a href="#">
                      <div class="thumbnail">
                          <img src="http://placehold.it/45x45" />
                      </div>
                      <div class="description">
                          <strong>HTML5 Audio</strong><p>2012-03-15</p>
                      </div>
                  </a></li>
                  <li class="item"><a href="#">
                      <div class="thumbnail">
                          <img src="http://placehold.it/45x45" />
                      </div>
                      <div class="description">
                          <strong>HTML5 Video</strong><p>2012-03-15</p>
                      </div>
                  </a></li>
                  <li class="item"><a href="#">
                      <div class="thumbnail">
                          <img src="http://placehold.it/45x45" />
                      </div>
                      <div class="description">
                          <strong>HTML5 Semantic Web</strong><p>2012-03-15</p>
                      </div>
                  </a></li>
              </ul>
          </div>
          <div class="tab_item">
              <ul>
                  <li class="item"><a href="#">
                      <div class="thumbnail">
                          <img src="http://placehold.it/45x45" />
                      </div>
                      <div class="description">
                          <strong>CSS3 Transition</strong><p>2012-03-15</p>
                      </div>
                  </a></li>
                  <li class="item"><a href="#">
                      <div class="thumbnail">
                          <img src="http://placehold.it/45x45" />
                      </div>
                      <div class="description">
                          <strong>CSS3 Animation</strong><p>2012-03-15</p>
                      </div>
                  </a></li>
                  <li class="item"><a href="#">
                      <div class="thumbnail">
                          <img src="http://placehold.it/45x45" />
                      </div>
                      <div class="description">
                          <strong>CSS3 Border</strong><p>2012-03-15</p>
                      </div>
                  </a></li>
                  <li class="item"><a href="#">
                      <div class="thumbnail">
                          <img src="http://placehold.it/45x45" />
                      </div>
                      <div class="description">
                          <strong>CSS3 Box</strong><p>2012-03-15</p>
                      </div>
                  </a></li>
              </ul>
          </div>
      </aside>
  </div>
  <footer id="main_footer">
      <h3>HTML5 + CSS3 Basic</h3>
      <address>Website Layout Basic</address>
  </footer>
</body>
</html>
'''

# 문자열 HTML -> BeautifulSoup 객체화
Soup = BeautifulSoup(HTMLdata,features="html.parser")

# BeautifulSoup,Tag 객체 -> 문자열 HTML
# prettify() 태그마다 들여쓰기로 가독성을 가지며 변환
print(Soup.prettify())

# Dot 방식을 통해 하위 태그에 접근하기
html = Soup.html
head = html.head
print(head.prettify())
print(Soup.html.head.prettify())


#만나는 가장 첫번 째 태그를 가짐
meta = head.meta
print(head.meta.prettify())
print(meta.next_sibling.next_sibling)


# 검색하기
a = head.find("meta")
b = head.find_all("meta")
c = html.find("meta")
d = html.find_all("meta")
e = Soup.find("meta")
f = Soup.find_all("meta")


#조건 추가해서 검색하기
a = Soup.find(id='title')
b = Soup.find_all(class_ = 'main_article')
c = Soup.find(attrs = {'charset':'utf-8'})


#제한 검색하기
#Soup의 바로 아래의 하위태그에서만 검색
a = Soup.find_all("meta",recursive = False) #결과 [] 빈 List
b = Soup.find_all("meta") #Soup안에 존재하는 모든 태그들 중 meta 태그
c = head.find_all("meta",recursive = False) #결과 head태그 바로 아래의 meta 태그들


#태그 이름 가지고오기
print(Soup.find("meta").name)
#find_all의 경우 List이기 때문에 하나씩 꺼내어 가지고 와야됩니다.
for item in Soup.find_all("meta"):
    print(item.name)

#태그 속성 값 가지고오기
a = Soup.find_all("meta")
b = a[2].attrs
print(b)
print(a[2].attrs)

#태그의 HTML 문자열 가지고오기
a = Soup.find(id='title')
print(a)
print(type(a)) #Tag 객체입니다.

#만약 문자열로 이용하고 싶다면 문자열 변환을 해주어야합니다.
b = str(a)
print(b)
print(type(b))


#Text 받아오기
a = Soup.find("nav",id='main_gnb')
print(a.get_text())

#옵션을 주어서 개행문자를 제거 또는 특정 규칙으로 나누기
print(a.get_text(strip=True))
print(a.get_text(' ',strip=True))
728x90
반응형

Commnet

G91개발일지

Gon91(지구일)

91년생 공학엔지니어의 개발일지

TODAY :

YESTER DAY :

TOTAL :