1.  BeautifulSoup

🍯  구문을 분석해서 필요한 내용만 추출 할 수 있는 기능을 가지고 있는 패키지

        ➡️  xml or html을 수프객체로 만들어서 추출하기 쉽게 만들어 준다.

from bs4 import BeautifulSoup as bs  # bs4 라이브러리에서 Beautiful Soup를 import
import requests
import pprint

# html 파일 가져오기
with open('./sample.html', 'r', encoding='utf-8') as file:
    html = file.read()

# html.parser : html 코드를 사용하기 쉽게 BeautifulSoup의 객체로 분석
soup = bs(html, 'html.parser')  
# 첫번째 인자: 분석할 내용 전달
# 두번째 인자: "html"로 분석한다는 것을 명시

print(type(soup))  # <class 'bs4.BeautifulSoup'>
print(soup)  # (html 출력)

print(soup.find('title').text)  # This is title
print(soup.find('div').text)  # Division의 약자로, 레이아웃을 나누는데 사용.
print(soup.find('h1').text.strip())  # This is heading1 text.

 


 

1) find ()

🥑  지정된 태그들 중에서 가장 첫 번째 태그만 가져오는 메소드(하나의 값만 반환)로 문자열 형태로 반환
       ➡️  일반적으로 하나의 태그만 존재하는 경우에 사용  만약 여러 태그가 있으면 첫 번째 태그만 가져옴

 

# 속성값 가져오는 경우 형식 (find, find_all 동일)
find(태그명['속성명'])
find(태그명.attrs['속성명'])
find(태그명).get(속성명)
find_all('태그명', attrs={'속성명':'값'})
# 위키피디아 '대구광역시' 페이지
url = 'https://ko.wikipedia.org/wiki/%EB%8C%80%EA%B5%AC%EA%B4%91%EC%97%AD%EC%8B%9C'
resp = requests.get(url)
soup = bs(resp.text, 'html.parser')

first_img = soup.find(name='img')  # img 태그 중에 제일 먼저 나오는 것
print(type(first_img))  # <class 'bs4.element.Tag'>
print(first_img)  
# <img alt="" aria-hidden="true" class="mw-logo-icon" height="50" 
# src="/static/images/icons/wikipedia.png" width="50"/>

target_img = soup.find(name='img', attrs={'alt': 'Daedongyeojido (Gyujanggak) 17-02.jpg'})
print(target_img)
# <img alt="Daedongyeojido (Gyujanggak) 17-02.jpg" class="mw-file-element" 
# data-file-height="3005" data-file-width="4000" decoding="async" height="376" 
# src="//upload.wikimedia.org/wikipedia/commons/thumb/c/c5/
# Daedongyeojido_%28Gyujanggak%29_17-02.jpg/500px-Daedongyeojido_%28Gyujanggak%29_17-02.
# jpg" srcset="//upload.wikimedia.org/wikipedia/commons/thumb/c/c5/Daedongyeojido_
# %28Gyujanggak%29_17-02.jpg/750px-Daedongyeojido_%28Gyujanggak%29_17-02.jpg 1.5x, 
# //upload.wikimedia.org/wikipedia/commons/thumb/c/c5/Daedongyeojido_%28Gyujanggak%
# 29_17-02.jpg/1000px-Daedongyeojido_%28Gyujanggak%29_17-02.jpg 2x" width="500"/>


 

2)  find_all() 

🥑  지정한 태그들을 모두 가져오는 메소드로 가져온 태그들은 모두 리스트에 보관

# 네이버 스포츠 페이지에서 박스 뉴스 제목 들고 옴
url = 'https://sports.news.naver.com/index.nhn'
response = requests.get(url)
soup = bs(response.text, 'html.parser')

today_list = soup.find('ul', {'class': 'today_list'})
print(today_list)

today_list_title = today_list.find_all('strong', {'class', 'title'})
pprint.pprint(today_list_title)  # 리스트로 반환

for title in today_list_title:
    print(title.text.strip())

1. today_list 결과
2. today_list_title 결과
3. 반복문 실행결과

 


 

3) find_all 사용 예제

a. 다음 뉴스 사이트 html 분석

url = 'https://news.daum.net/'
response = requests.get(url)
soup = bs(response.text, 'html.parser')


 

b. a 태그의 갯수 출력

 

   👾  html의 'a' 태그 : 다른 콘텐츠와 연결되는 하이퍼링크(hyperlink)를 정의

print('1. a 태그의 갯수')
print(len(soup.find_all('a')))  # 124

 

c. a 태그 20개만 출력

print('2. a 태그 20개만 출력')
for news in soup.find_all('a')[:20]:
    print(news.text.strip())

실행결과


 

d.  a 태그 링크 5개 출력

print('3. a 태그 링크 5개 출력')
for i in soup.find_all('a')[:5]:
    print(i.attrs['href'])
    print(i.get('href'))
    # -> 둘 중 하나만 쓰면 된다.
print("=" * 20)

 

실행결과


 

e.  특정 클래스 속성을 출력하기

print('4. 특정 클래스 속성을 출력')
print(soup.find_all('div', {'class': 'item_issue'}))
print("=" * 20)

실행결과


f.  링크를 텍스트 파일로 저장

print('5. 링크를 텍스트 파일로 저장')
file = open('../output_02/links.txt', 'w')  # 쓰기 전용 파일 생성

for i in soup.find_all('div', {'class': 'item_issue'}):
    file.write(i.find('a').get('href') + '\n')
file.close()

실행결과

 

 

 

 

 

[ 내용 참고 : IT 학원 강의 ]

+ Recent posts