Python 데이터 분석
Python 데이터분석 기초 9 - BeautifulSoup
코딩탕탕
2022. 11. 1. 12:14
# BeautifulSoup 클래스가 제공하는 searching 관련 method
from bs4 import BeautifulSoup
html_page = """
<html><body>
<h1>제목 태그</h1>
<p>웹 문서 스크래핑</p>
<p>특정 페이지 문서 읽기</p>
</body></html>
"""
print(type(html_page))
soup = BeautifulSoup(html_page, 'html.parser')
print(type(soup))
print(soup)
print()
h1 = soup.html.body.h1
print('h1:',h1) # innerTEXT 형식
print('h1:',h1.string) # innerHTML 형식
print('h1:',h1.text) # innerHTML 형식
print()
p1 = soup.html.body.p
print('p1:',p1.string)
p2 = p1.next_sibling.next_sibling
print('p2:',p2.string)
print('\n검색용 메소드 : find()')
html_page2 = """
<html><body>
<h1 id="title">제목 태그</h1>
<p>웹 문서 스크래핑</p>
<p id="my" class="our">특정 페이지 문서 읽기</p>
</body></html>
"""
soup2 = BeautifulSoup(html_page2, 'html.parser')
print(soup2.p, ' ', soup2.p.string) # 최초 p태그만 만난다.
print(soup2.find('p').string) # 최초 p태그만 만난다.
print(soup2.find(['p', 'h1']).string) # 복수를 사용할 수 있으나 string이 적혀있으므로 뒤에것만 호출된다.
print(soup2.find(id='title').string) # id로 검색
print(soup2.find(id='my').string) # id로 검색
print(soup2.find(class_='our').string) # class로 검색, 뒤에 _를 붙여야 된다.
print(soup2.find(attrs={'class':'our'}).string) # attrs로도 사용 가능
print(soup2.find(attrs={'id':'my'}).string) # attrs로도 사용 가능
print('\n검색용 메소드 : findAll(), find_all()')
html_page3 = """
<html><body>
<h1 id="title">제목 태그</h1>
<p>웹 문서 스크래핑</p>
<p id="my" class="our">특정 페이지 문서 읽기</p>
<div>
<a href="https://www.naver.com" class="aa">naver</a><br/>
<a href="https://www.daum.net" class="aa">daum</a><br/>
</div>
</body></html>
"""
soup3 = BeautifulSoup(html_page3, 'html.parser')
print(soup3.find_all('p')) # 복수의 p 값을 호출
print(soup3.find_all('a'))
print(soup3.find_all(['a','p'])) # 복수의 태그 호출
print(soup3.findAll(class_='aa')) # 같은 class 복수 호출
print(soup3.findAll('p'))
print()
links = soup3.find_all('a')
for i in links:
print(i.attrs['href'], ' - ', i.string)
print('정규 표현식')
import re
links2 = soup3.find_all(href=re.compile(r'^https'))
for i in links2:
print(i.attrs['href'], ' - ', i.string)
print('\nCSS의 selector 사용')
html_page4 = """
<html><body>
<div id="hello">
<a href="https://www.naver.com" class="aa">naver</a><br/>
<span>
<a href="https://www.daum.net" class="aa">daum</a><br/>
</span>
<ul class="world">
<li>안녕</li>
<li>반가워</li>
</ul>
</div>
<div id="hi" class="good">
second div
</div>
</body></html>
"""
soup4 = BeautifulSoup(html_page4, 'html.parser')
print(soup4.select_one('div')) # 첫번째 div만 호출
print()
print(soup4.select_one('div#hi')) # id가 hi인 div 호출
print(soup4.select_one('div.good')) # class가 good인 div 호출
print()
print(soup4.select('div#hello > a')) # 복수 반환 (직계 자식)
print(soup4.select('div#hello a')) # 복수 반환 (자손)
print(soup4.select('div#hello > span > a'))
lis = soup4.select('div#hello ul.world > li')
print(lis)
msg = list() # []
for i in lis:
msg.append(i.string)
import pandas as pd
df = pd.DataFrame(msg, columns = ['자료'])
print(df)
<console>
<class 'str'>
<class 'bs4.BeautifulSoup'>
<html><body>
<h1>제목 태그</h1>
<p>웹 문서 스크래핑</p>
<p>특정 페이지 문서 읽기</p>
</body></html>
h1: <h1>제목 태그</h1>
h1: 제목 태그
h1: 제목 태그
p1: 웹 문서 스크래핑
p2: 특정 페이지 문서 읽기
검색용 메소드 : find()
<p>웹 문서 스크래핑</p> 웹 문서 스크래핑
웹 문서 스크래핑
제목 태그
제목 태그
특정 페이지 문서 읽기
특정 페이지 문서 읽기
특정 페이지 문서 읽기
특정 페이지 문서 읽기
검색용 메소드 : findAll(), find_all()
[<p>웹 문서 스크래핑</p>, <p class="our" id="my">특정 페이지 문서 읽기</p>]
[<a class="aa" href="https://www.naver.com">naver</a>, <a class="aa" href="https://www.daum.net">daum</a>]
[<p>웹 문서 스크래핑</p>, <p class="our" id="my">특정 페이지 문서 읽기</p>, <a class="aa" href="https://www.naver.com">naver</a>, <a class="aa" href="https://www.daum.net">daum</a>]
[<a class="aa" href="https://www.naver.com">naver</a>, <a class="aa" href="https://www.daum.net">daum</a>]
[<p>웹 문서 스크래핑</p>, <p class="our" id="my">특정 페이지 문서 읽기</p>]
https://www.naver.com - naver
https://www.daum.net - daum
정규 표현식
https://www.naver.com - naver
https://www.daum.net - daum
CSS의 selector 사용
<div id="hello">
<a class="aa" href="https://www.naver.com">naver</a><br/>
<span>
<a class="aa" href="https://www.daum.net">daum</a><br/>
</span>
<ul class="world">
<li>안녕</li>
<li>반가워</li>
</ul>
</div>
<div class="good" id="hi">
second div
</div>
<div class="good" id="hi">
second div
</div>
[<a class="aa" href="https://www.naver.com">naver</a>]
[<a class="aa" href="https://www.naver.com">naver</a>, <a class="aa" href="https://www.daum.net">daum</a>]
[<a class="aa" href="https://www.daum.net">daum</a>]
[<li>안녕</li>, <li>반가워</li>]
자료
0 안녕
1 반가워
BeautifulSoup 사용 방법 및 웹 문서 스크랩핑
참조 사이트 : 영문 https://www.crummy.com/software/BeautifulSoup/bs4/doc/http://dplex.egloos.com/category/Python : BeautifulSoup examplehttp://lxml.de : lxml 라이브러리로 대량의 파일 처리 가능 ---
cafe.daum.net