[Python 재무제표 크롤링 #5] Requests, BeautifulSoup로 크롤링(Crawling), 데이터 추출하기(Data Extraction) - 2

이전 포스팅과 이어지는 내용입니다. 아래 링크를 참조해 주시기 바랍니다.


▶[Python] - [Python] Requests, BeautifulSoup로 크롤링(Crawling), 데이터 추출하기(Data Extraction) - 1



| 시작하기 전에


이번 포스팅에서 사용할 HTML 코드를 받아야합니다. 아래의 python 스크립트를 실행하시면 됩니다. 

import requests
from bs4 import BeautifulSoup

page = requests.get("http://dataquestio.github.io/web-scraping-pages/simple.html")
soup = BeautifulSoup(page.content, 'html.parser')


| BeautifulSoup로 모든 태그 정보 한 번에 찾기


page.content라는 URL에서 막 다운받은 HTML 코드에서 p태그의 정보를 찾을려면 다음과 같은 코드를 입력하면 됩니다.

p_data = soup.find_all('p')
print(p_data)
data = p_data[0].get_text()
print(data)
[<p>Here is some simple content for this page.</p>]
Here is some simple content for this page.

find_all 메서드를 통해서 HTML 문서에 포함된 모든 p 태그의 정보를 찾게 됩니다. 그리고 리스트 형으로 그 데이터를 반환하게 되죠. 그 중 원하는 p태그의 데이터를 얻고 싶으면 인덱스를 통해 접근하여 get_text 메서드를 사용하면됩니다.


맨 처음 특정 태그의 정보를 얻고 싶으면 find 메서드를 이용하시면 됩니다. 여기서는 특별히 다루지 않겠습니다.



| class 와 id를 통해 태그 찾기


CSS에서는 class와 id를 통해 어떤 HTML 태그에 해당 스타일을 적용할 지 결정하게 됩니다. 이 점을 이용해서 BeautifulSoup에서는 쉽게 데이터를 추출하는 데 사용합니다. 


이제부터는 위의 간단한 HTML 예제 말고 좀 더 복잡한 HTML 예제를 사용하도록 하겠습니다.

URL = "http://dataquestio.github.io/web-scraping-pages/ids_and_classes.html"
page = requests.get(URL)
soup = BeautifulSoup(page.content, 'html.parser')
print(soup.prettify())
<html>
<head>
<title>A simple example page</title>
</head>
<body>
<div>
<p class="inner-text first-item" id="first">
                First paragraph.
            </p>
<p class="inner-text">
                Second paragraph.
            </p>
</div>
<p class="outer-text first-item" id="second">
<b>
                First outer paragraph.
            </b>
</p>
<p class="outer-text">
<b>
                Second outer paragraph.
            </b>
</p>
</body>
</html>

위에서 사용했었던 find_all 메서드를 사용하여 'p' 태그인데 class명이 outer-text인 태그들을 찾도록 하겠습니다.

p_tags = soup.find_all('p', class_='outer-text')
print(p_tags)
[<p class="outer-text first-item" id="second">
 <b>
                 First outer paragraph.
             </b>
 </p>, <p class="outer-text">
 <b>
                 Second outer paragraph.
             </b>
 </p>]

단순 class명 만으로도 태그 정보를 찾을 수 있습니다.

outer_texts = soup.find_all(class_='outer-text')
print(outer_texts )
[<p class="outer-text first-item" id="second">
 <b>
                 First outer paragraph.
             </b>
 </p>, <p class="outer-text">
 <b>
                 Second outer paragraph.
             </b>
 </p>]

id를 통해 태그 정보를 찾는 코드입니다.

first_id_tag = soup.find_all(id="first")
print(first_id_tag)
[<p class="inner-text first-item" id="first">
                 First paragraph.
             </p>]



| CSS Selector를 통해서 태그 정보 찾기 

 CSS selector는 CSS에서 HTML 요소를 선택할 수 있게 하는 선택 문법입니다. CSS selector의 문법을 잘 모르시는 분들을 위에서 몇 가지 예를 들겠습니다. 
  • p a - 모든 p 태그 안의 a 태그를 찾기 
  • body p a - 모든 body 태그 안의 p 태그 안의 a 태그를 찾기 
  • p#first - 아이디 명이 first인 p 태그 찾기 
  • p.outer-text - 클래스 명이 outer-text인 p 태그 찾기 
  • body p.outer-text - body 태그 안의 클래스 명이 outer-text인 p 태그를 찾기 

위를 보시면 어떤 규칙성을 발견하실 수 있을 겁니다. 왼쪽에서 오른쪽 순서대로 HTML의 계층적 구조를 이용해서 부모 태그의 자식 태그를 선택해서 선별한다는 걸 알 수 있죠. BeautifulSoup에서는 이 규칙성을 활용해서 태그 정보를 쉽게 찾아 냅니다.
div_p_tag = soup.select("div p")
print(div_p_tag)
[<p class="inner-text first-item" id="first">
                 First paragraph.
             </p>, <p class="inner-text">
                 Second paragraph.
             </p>]


| 마치며 

 BeautifulSoup를 통해서 HTML문서를 어떻게 파싱하고 데이터를 추출하는 지 알아보았습니다. HTML문서를 BeautifulSoup를 이용하지 않고 데이터를 추출하려면 상당한 시간의 노력이 드는 것은 물론이고 난잡한 코드를 양산할 가능이 매우 높아집니다. 이를 BeautifulSoup는 HTML과 CSS의 성질을 이용해서 간단한 코드만으로도 아주 쉽게 원하는 데이터를 추출할 수 있게 만들었습니다. Request, BeautifulSoup 라이브러리만 제대로 사용해도 웹 크롤링은 큰 문제없이 진행하실 수 있을 겁니다.


도움이 되셨다면  공감 버튼 꾹 눌러주시면 감사하겠습니다 


참고자료 : https://www.dataquest.io/blog/web-scraping-tutorial-python/

이 글을 공유하기

댓글(0)

Designed by JB FACTORY