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