파이썬 BeautifulSoup 크롤링 - paisseon BeautifulSoup keulolling

스푸트니크 2021. 9. 10. 22:21

BeautifulSoup 모듈

BeautifulSoup 모듈의 정의

- 홈페이지 내 데이터를 쉽게 추출할 수 있도록 도와주는 파이썬 외부 라이브러리

- 웹 문서 내 수많은 HTML 태그들을 파서(parser)를 활용해 사용하기 편한 파이썬 객체로 만들어 제공

- 웹 문서 구조를 알고 있다면, 아주 편하게 원하는 데이터를 뽑아 활용할 수 있음

BeautifulSoup 모듈 사용법

BeautifulSoup은 HTML을 파싱하여 구조화하는 모듈로 urllib, requests 모듈 등과 함께 사용

-> requests 모듈이나 urllib모듈 등으로 웹 문서를 텍스트로 가져온 뒤 BeautifulSoup 모듈로 분석

샘플용 데이터

html_doc = '''
<html>
    <head>
        <meta charset="utf-8"> <title>NAVER</title> 
        <meta http-equiv="X-UA-Compatible" content="IE=edge"> 
        <meta name="viewport" content="width=1190"> 
        <meta name="apple-mobile-web-app-title" content="NAVER">
        <meta name="robots" content="index,nofollow"> 
        <meta name="description" content="네이버 메인에서 다양한 정보와 유용한 컨텐츠를 만나 보세요"> 
        <meta property="og:title" content="네이버"> <meta property="og:url" content="https://www.naver.com/">
        <meta property="og:image" content="https://s.pstatic.net/static/www/mobile/edit/2016/0705/mobile_212852414260.png"> 
        <meta property="og:description" content="네이버 메인에서 다양한 정보와 유용한 컨텐츠를 만나 보세요"> 
        <meta name="twitter:card" content="summary"> 
        <meta name="twitter:title" content=""> 
        <meta name="twitter:url" content="https://www.naver.com/"> 
        <meta name="twitter:image" content="https://s.pstatic.net/static/www/mobile/edit/2016/0705/mobile_212852414260.png"> 
        <meta name="twitter:description" content="네이버 메인에서 다양한 정보와 유용한 컨텐츠를 만나 보세요">
    </head>
    <body>
    </body>
</html>

'''

BeautifulSoup 모듈 임포트

from bs4 import BeautifulSoup

soup = BeautifulSoup(html_doc, 'html.parser')
print(soup.prettify())
파이썬 BeautifulSoup 크롤링 - paisseon BeautifulSoup keulolling
실행결과
BeautifulSoup("<a></p>","html.parser")#알아서 잘못된 테그를 수정해줌, 주력으로 사용할 것.

<a></a>

BeautifulSoup("<a></p>","html5lib")#html5 구조로 수정해줌

<html><head></head><body><a><p></p></a></body></html>

BeautifulSoup("<a><b /></a>", "xml")#xml 형태로 해석해달라

<?xml version="1.0" encoding="utf-8"?>

<a><b/></a>

BeautifulSoup("<a></p>", "lxml")

<html><body><a></a></body></html>


BeautifulSoup 모듈 에서의 검색

이쁘게 불러왔으면 쓸 정보를 추려내야지..

태그: HTML의 해당 태그에 대한 첫 번째 정보를 가져옴

->태그[‘속성’] : HTML 해당 태그의 속성에 대한 첫 번째 정보를 가져옴

import requests
from bs4 import BeautifulSoup

req = requests.get('https://www.naver.com')
html = req.text
soup = BeautifulSoup(html, 'html.parser')
print(soup.title)#타이틀 전체를 가져옴
print(soup.title.name)#타이틀 태그의 이름을 가져옴
print(soup.title.string)#타이틀 태그의 내용을 가져옴
print(soup.img['alt'])#첫 번째 alt정보를 가져옴
print(soup.img['src'])#첫 번째 src정보를 가져옴

<title>NAVER</title>

title

NAVER

https://static-whale.pstatic.net/main/

find(): HTML의 해당 태그에 대한 첫 번째 정보를 가져옴

- find(속성 = ‘값’) : HTML 해당 속성과 일치하는 값에 대한 첫번째 정보를 가져옴

print(soup.find('a'))#a라는 태그속성과 일치하는 첫번째 정보를 가져옴

<a href="#newsstand"><span>뉴스스탠드 바로가기</span></a>

find_all(): HTML의 해당 태그에 대한 모든 정보를 리스트 형식으로 가져옴

- limit 옵션으로 개수 지정 가능

- css 속성으로 필터링 (class_클래스를 직접 사용 혹은 attrs에서 속성 = 값 으로 필터링)

- 문자열(string)으로 검색(해당 값이 있는지 없는지 검사할 때 활용, 정규 표현식과 함께 활용)

print(soup.find_all('a', limit = 2))#a태그의 정보를 2개만 뽑아오자

[<a href="#newsstand"><span>뉴스스탠드 바로가기</span></a>, <a href="#themecast"><span>주제별캐스트 바로가기</span></a>]

print(soup.find_all('a')[0]) #a 태그 전체 중 첫번째 것만 출력

<a href="#newsstand"><span>뉴스스탠드 바로가기</span></a>

#css 속성으로 필터링 (class_ 로 클래스를 직접 사용 혹은 attrs에서 속성 = 값 으로 필터링)
print(soup.find_all('span', class_ = 'blind'))
파이썬 BeautifulSoup 크롤링 - paisseon BeautifulSoup keulolling
#css 속성으로 필터링 (class_ 로 클래스를 직접 사용 혹은 attrs에서 속성 = 값 으로 필터링)
print(soup.find_all('span', attrs = {"class" : "blind"}))
파이썬 BeautifulSoup 크롤링 - paisseon BeautifulSoup keulolling
#문자열(string)으로 검색(해당 값이 있는지 없는지 검사할 때 활용, 정규 표현식과 함께 활용)
print(soup.find_all(string = '자동완성 끄기'))
print(soup.find_all(string = '네이버'))

['자동완성 끄기']

[] #찾는 문자열이 없으면 빈 리스트

#정규표현식과 함께 활용해 문자열이 포함된 모든 것을 검색할 때
import re #정규표현식의 약자 regular expression
print(soup.find_all(string = re.compile("네이버")))

['네이버를 시작페이지로', '쥬니어네이버', '네이버 카카오 폭락장 지켜본 외국계 증권사…"전형적인 매수 기회"', '네이버뉴스', '언론사가 직접 편집한 뉴스들을 네이버 홈에서 바로 보실 수 있습니다.', '네이버 개발자 센터', '네이버 D2', '네이버 D2SF', '네이버 랩스', '네이버 정책 및 약관', '네이버 정책']

select_one(), select()

- css 선택자를 활용하여 원하는 정보를 가져옴(태그를 검색하는 find, find_all과 비슷함)

- select( ‘ul > 태그’ ) 형식으로 해야함

파이썬 BeautifulSoup 크롤링 - paisseon BeautifulSoup keulolling
html 구조 복습 겸 재확인, 알아야 크롤링한다.
print(soup.select_one('a'))#a태그 요소 하나만 가져옴

<a href="#newsstand"><span>뉴스스탠드 바로가기</span></a>

print(soup.select('a')[0])#리스트 형태로 가져옴 첫번째 a태그 요소

<a href="#newsstand"><span>뉴스스탠드 바로가기</span></a>

print(soup.select('body a'))#body 태그안에 있는 앵커태그
파이썬 BeautifulSoup 크롤링 - paisseon BeautifulSoup keulolling
print(soup.select('div > ul'))#div 태그 하위 요소의 ul태그를 찾는다.
파이썬 BeautifulSoup 크롤링 - paisseon BeautifulSoup keulolling

BeautifulSoup 모듈 에서의 가공

get_text() : 검색 결과에서 태그를 제외한 텍스트만 출력

- get(‘속성’) : 해당 속성의 값을 출력

text = soup.find("span", attrs = {"class":"blind"})
print(text)
print(text.get_text())#테그를 제외한 텍스트만 출력

<span class="blind">NAVER whale</span>

NAVER whale

text = soup.find("span", attrs = {"class":"blind"})
print(text)
print(text.get('class'))#해당 속성의 값을 출력 클래스의 값이 blind

<span class="blind">NAVER whale</span>

['blind']

import requests
from bs4 import BeautifulSoup

text = """
<li class = "nav_item">
    <a href = "https://www.naver.com" class = "nav">메일</a>
</li>
"""

soup = BeautifulSoup(text, "html.parser")
print(soup.string)#태그 안에 또 다른 태그가 있는 경우는 None

result = soup.find('a', class_ = 'nav')
print(result)
print(result.string)#string: 태그 안에 또 다른 태그가 없는 경우 해당 내용을 출력