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())
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 학원 강의 ]
'Programming Language > Python' 카테고리의 다른 글
[Python] 웹 크롤링 | 이미지 가져오기 및 저장 (0) | 2024.03.10 |
---|---|
[Python] 웹 크롤링 | BeautifulSoup의 select_one() 과 select(), CSS select 지정 형식 (0) | 2024.03.08 |
[Python] 웹 크롤링 | request 와 requests, 크롤링 허용 여부 확인방법 (1) | 2024.03.07 |
[Python] XML 정의 및 xmltodict 라이브러리, 예제 (2) | 2024.03.06 |
[Python] JSON API 활용 예제 2 (0) | 2024.03.06 |