[Python] WEB 크롤링 라이브러리, BeautifulSoup

BeautifulSoup

  • 데이터를 추출하는데 필요한 기능이 들어 있는 파싱(parsing)라이브러리

    웹 스크래핑에 활용할 수 있습니다.

    • 파싱 : 받아온 데이터에서 필요한 내용만 추출하는 것

    • 스크래핑(scraping) : 컴퓨터 프로그램이 다른 프로그램으로부터 들어오는 인간이 읽을 수 있는 출력으로부터 데이터를 추출하는 기법

  • 예제를 통해 이해하는 것이 빠를 것 같습니다.

Ex

import requests
from bs4 import BeautifulSoup

# url을 정의하고 requests library를 이용하여 get 요청 > html 값을 text로 받아옵니다.
url = "https://finance.naver.com/sise/"
response = requests.get(url).text

# BeautifulSoup 객체 생성, html.parser 를 parser로 사용
soup = BeautifulSoup(response, "html.parser")

# BeautifulSoup html > body > h1 Tag
h1 = soup.html.body.h1
# h1 Tag string
print(h1.string)
print(soup.html.body.h1.string)

# BeautifulSoup 객체의 html > body > p First Tag 첫 줄
p1 = soup.html.body.p
print(p1.string)

# p1 다음 줄
p2 = p1.next_sibling.next_sibling
print(p2.string)

# print all of p tag
for i in soup.find_all('p'):
    print(i.string)
    print(i.get_text())

# find body tag
body_tag = soup.find('body')

# 단일 문장을 뽑는 방법
# body는 여러 문장이기 때문에 출력 불가
body_tag.string

# 오류는 나지 않지만 값이 안나옴
# 여러 문장을 뽑는방법 1
body_tag.get_text()             # get_text()는 단일 문장을 뽑을 땐 사용불가
body_tag.get_text(strip=True)   # 이스케이프 코드를 출력하지 않는 방법

# 여러 문장을 뽑는방법 2
for i in body_tag:
    print(i.string)

# 여러 문장을 뽑는방법 3
for i in soup.find_all('body'):
    print(i.get_text())

for i in soup.findAll('body'):
    print(i.get_text())

# id값으로 문자열 뽑기
main_area = soup.find(id='main-area').string

# attrs : 속성값 모두 출력
a_tag = soup.html.body.ul.li.a
print(a_tag.attrs)

# 속성값 중 'href' 값 출력
print(a_tag['href'])
print(a_tag.attrs['href'])

# a태그의 'href' 값과 문장 모두 출력
for i in soup.find_all('a'):
    print(i.attrs['href'])
    print(i.string)