본문 바로가기
PYTHON/파이썬_라이브러리&모듈

파이썬 BeautifulSoup라이브러리

by 시에라177 2022. 5. 12.

#정적 웹 페이지 크롤링

-웹API가 제공되지 않는 웹 페이지에서 크롤링을 하려면 해당 웹 페이지의 HTML분석하고, 필요한 데이터를 직접 추출해야함. 이 떄 HTML구조를 분석하는 작업을 파싱이라고하며, 이때 파이썬에서 사용하는 라이브러리가 BeautifulSoup라이브러리.

 

 

BeautifulSoup라이브러리

-HTML문서에서 원하는 부분만 가져오고 싶을 때 사용하는 라이브러리

-어렵게 말하자면 HTML문서를 정리된 파스트리로 변환하여 주는 라이브러리

 

(#라이브러리 이름이 이 모양인 이유 : 예전에 지저분하고 보기힘들고 문법적으로 틀린 HTML 웹 문서를 tag soup라고 부름.

이런 soup를 보기 좋게 바꾸어준다고 하여 라이브러리 이름이 뷰티풀수프로 지어짐...)

 

0. 사용전 : from bs4 import BeautifulSoup로 임포트해온다.

 

1.수프(soup)객체를 만들어 그 안에 BeautifulSoup로 처리한 것을 담는다

soup(수프객체) = BeautifulSoup( 문서, 파서(해석기라고도 함))

-문서는 html파일, text로 디코딩된 것이나 content인 것 들 중 아무거나.

-파서는 일반적으로 html.parser사용

-BeautifulSoup로 처리한 것을 담는 객체를 수프객체라고 하겠음.(정확한 용어 표현인지는 모름)

 

 

#수프객체 다루기

1.수프객체.prettify()

-html문서의 구조를 보기 좋게 만들어서 보여줌.

 

2.지정한 태그하나만 파싱하기

-수프객체.태그명

-태그객체 = 수프객체.태그명        (tag1 = soup.h1)

-지정한 태그의 첫 번째 것만 파싱함

2-1. 지정한 태그와 속성으로 파싱

-수프객체.태그['속성명']             (ta1 = soup.h1['href'])

from bs4 import BeautifulSoup
import requests
url = "http://runtimeerror44.tistory.com/"
response = requests.get(url)
html = response.content
soup = BeautifulSoup(html, 'html.parser')

soup.h1
>><h1 id="title">런타임의 블로그</h1>
tag_h1_1 = soup.h1
>><h1 id="title">런타임의 블로그</h1>
tag_h1_1 = soup.h1['class']
print(tag_h1_1)
>>['logo', 'special']

3.attrs

-태그객체.attrs

-속성의 이름과 속성값을 딕셔너리로 구성하여 보여줌

3-1.해당 태그 객체의 속성값 알아내기

-태그객체['속성명']

-태그객체.attrs['속성명']

tag_h1_1 = soup.h1
tag_h1_1.attrs
>>{'class': ['logo', 'special']}

tag_h1_1['class']
>>['logo', 'special']
tag_h1_1.attrs['class']
>>['logo', 'special']

 

4. html문서 혹은 태그 객체의 텍스트만 가져오기

-soup.get_text() 수프 문서객체에서 텍스트만 가져옴

-태그.text

-태그.get_text()

-위 두 방법의 차이는 딱히 없는 듯함.

for link in links:
    title = link.get_text()  #태그안에 텍스트요소를 가져온다
    print(title)
	title2 = link.text
    print(title2)

#위 두 코드 결과 모두

>>크롤링ST6-CSS선택자 
파이썬 time/ datetime모듈 
파이썬 urllib라이브러리 
크롤링ST5- 크롤링을 위한 HTML 
크롤링ST4-파싱/파서 
파이썬 json라이브러리 
파이썬 requests라이브러리 
크롤링ST3-requests 와 urllib.request 
크롤링ST2- 공공데이터 API기반 크롤링 
크롤링1ST-네이버API를 이용한 크롤링

5.select메소드 - CSS선택자로 데이터 추출하기

soup.select_one('선택자') - 선택하고자 하는 태그 첫 번째 것 하나만 파싱

soup.select('선택자')  -선택하고자하는 태그 여러개(모두)를 파싱 결과 반환은 리스트로 함.

ex)

from bs4 import BeautifulSoup
import requests

#<mark> </mark> 굵은 글씨로 만들어주는 태그
#href의 속성값은 뉴스원본 사이트로 가는 주소

#원하는 태그 선택
#a태그는 웹문서 내에 무수히 많기 때문에 뉴스제목만 나타내는 a태크만의 별명을 선택. class id 중에 class선택자로.

url = "https://search.naver.com/search.naver?where=news&sm=tab_jum&query=%EC%95%A0%ED%94%8C"

response = requests.get(url)
html = response.content  #응답객체에서 텍스트를 추출 -> html소스코드
#html = response.text도 가능

soup = BeautifulSoup(html, 'html.parser')
links = soup.select(".news_tit")  #결과는 리스트

for link in links:
    title = link.text  #태그안에 텍스트요소만 가져온다.지저분한 태그와 속성들을 지운 값만.
    
    #  title = link.attrs['title']도 제목만 가져옴, 해당태그의 title 속성에서 가져온것.
    
    origin = link.attrs['href']  # href의 속성값을 가져온다.
    print(title,origin)

6.find메소드 - 태그,속성,속성값을 이용하여 원하는 데이터 추출

-select메소드와 큰 차이가 없으며 select메소드를 사용하길 권장하는 추세이다.

-수프객체.find('태그명' or 속성명 = '속성값', or 둘다 명시)  하나만 반환

-수프객체.find_all(,,) 모두 찾아 리스트 형태로 반환

title = "<h1 class='titles' id='headtitle'> Hello World </h1>" 
soup = BeautifulSoup(title, 'html.parser') 

# 태그 이름만 특정 
print(soup.find('h1') )

# 태그 속성만 특정 
print(soup.find(class_='titles') )
print(soup.find(attrs = {'class':'titles'}))

# 태그 이름과 속성 모두 특정 
print(soup.find('h1', class_='titles'))