본문 바로가기
TIL/Python&Data

[Python 크롤링] 2. Beautiful Soup, bs4 사용법, find( ), find_all(), select()

by 왁왁s 2022. 10. 30.

Beautiful Soup란?

파이썬으로 웹사이트를 크롤링한 후에, HTML 태그로 부터 원하는 데이터를 가져오기 위해

데이터를 추출하고 파싱할 때 간편하게 해주는 오픈소스 라이브러리이다.

 

Beautiful Soup로 원하는 데이터를 가져온다는 것은 원하는 부분의 웹의 태그를 가져온다는 말과 같다.

 

Beautiful Soup 설치하기

cmd 창을 열고 아래의 명령어를 입력한 후 엔터를 친다.

pip install bs4

 


 

Beautiful Soup를 사용해 웹의 태그를 가져올 때는 함수를 사용하는데, find(), find_all(), select() 함수가 있다.

한번 알아보도록 하자.

 

find( ) 함수 

조건을 만족하는 태그를 하나만 가져오는 함수이다.

이 함수를 사용하면 HTML 코드 안에 원하는 태그를 찾아올 수 있다.

from bs4 import BeautifulSoup
ex1 = '''
<html>
    <head>
        <title> 연습용 </title>
    </head>
    <body>
        <p align="center">첫번째 텍스트입니다.</p>
        <p align="right">두번째 텍스트입니다.</p>
        <p align="left">세번째 텍스트입니다.</p>
    </body>
</html>
'''

soup = BeautifulSoup(ex1, 'html.parser')
soup.find('p')

위의 코드는 HTML을 임의로 만들고, HTML 태그 중 <p> 태그 부분을 찾는 코드이다.

 

 

soup = BeautifulSoup(ex1, 'html.parser')
soup.find('p')

BeautifulSoup(ex1, 'html.parser')은 HTML 코드가 담긴 변수 ex1을 넘겨서 파싱(분석)을 하고, 그 결과를 soup 변수에 저장한다. 파싱이 된 결과가 담긴 soup 변수에서 'p'이라는 태그를 .find( ) 함수로 찾는다.

 

출력된 결과 : 

<p align="center">첫번째 텍스트입니다.</p>

 

find( ) 함수는 동일한 태그가 여러 개 있을 경우 첫 번째 태그 1개만 가져온다.

 

soup.find('p', align="left")

위처럼 속성 값을 이용하여 원하는 태그를 추출할 수도 있다.

 

 


 

find_all( ) 함수 

해당 태그가 여러 개 있을 경우 모두 가져온다.

 

find_all( ) 함수를 사용해 'p' 태그를 찾는 코드이다.

from bs4 import BeautifulSoup
ex1 = '''
<html>
    <head>
        <title> 연습용 </title>
    </head>
    <body>
        <p align="center">첫번째 텍스트입니다.</p>
        <p align="right">두번째 텍스트입니다.</p>
        <p align="left">세번째 텍스트입니다.</p>
    </body>
</html>
'''

soup = BeautifulSoup(ex1, 'html.parser')
soup.find_all('p')

 

위의 코드를 실행하면 아래의 결과가 출력된다.

 

[<p align="center">첫번째 텍스트입니다.</p>,
 <p align="right">두번째 텍스트입니다.</p>,
 <p align="left">세번째 텍스트입니다.</p>]

 


 

태그 안의 '콘텐츠' 가져오기 

태그 내의 문장을 가져온다. -> string, get_text( ) 사용

soup = BeautifulSoup(ex1, 'html.parser')
txt = soup.find('p')
txt.string

결과 :

첫번째 텍스트입니다.

soup.find 함수를 이용해, p 태그를 찾은 후에 객체에서 string 값을 가져온다. string은 태그의 문장을 가지고 있으나 한 번에 한 문장 밖에 가져오지 못 한다.

 

해당 태그가 여러 개가 있고( find_all( ) 사용) 여러 개의 문장을 모두 가져오려면 for 반복문을 사용해주어야 한다.

soup = BeautifulSoup(ex1, 'html.parser')
txt = soup.find_all('p')
for i in txt:
    print(i.string)

결과 :

첫번째 텍스트입니다.
두번째 텍스트입니다.
세번째 텍스트입니다.

 

string 을 가져오는 방법 이외의 다른 방법은 'get_text( )' 함수를 사용하는 방법이 있다.

string 대신에 get_text( ) 함수를 사용해주면 된다.

soup = BeautifulSoup(ex1, 'html.parser')
txt = soup.find_all('p')
for i in txt:
    print(i.get_text())

 


 

select( ) 함수 

여러 옵션을 사용해 원하는 데이터 추출이 가능한 함수

 

select( ) 함수를 사용하면 다양한 옵션을 사용해 원하는 데이터를 추출할 수 있다.

 

(1) select(' 태그 이름 ')

soup = BeautifulSoup(ex, 'html.parser')
soup.select('p')

(2) select(' .클래스명 ')

soup = BeautifulSoup(ex, 'html.parser')
soup.select('.name')

(3) select(' 상위태그 > 하위태그 > 하위태그 ')

soup = BeautifulSoup(ex, 'html.parser')
soup.select('div > p > span')

(4) select(' 상위태그.클래스이름 > 하위태그.클래스이름 ')

soup = BeautifulSoup(ex, 'html.parser')
soup.select('p.name > span.number')

(5) select(' #아이디명 ')

soup = BeautifulSoup(ex, 'html.parser')
soup.select('#phone')

(6) select( #아이디명 > 태그명.클래스명 ')

soup = BeautifulSoup(ex, 'html.parser')
soup.select('#phone > span.number')

(7) select( '태그명[속성 = 값] ')

soup = BeautifulSoup(ex, 'html.parser')
soup.select('a[href]')

댓글