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]')
'TIL > Python&Data' 카테고리의 다른 글
[Python 크롤링 ] 4. selenium 사용 find_element 요소 접근 (0) | 2022.10.31 |
---|---|
[Python 크롤링] 3. selenium, bs4 크롤링 개발환경 설정 및 설치 (0) | 2022.10.30 |
[Python 크롤링] 1. requests, re 정규식 표현 (0) | 2022.10.23 |
댓글