ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Python 데이터분석 기초 9 - BeautifulSoup
    Python 데이터 분석 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

     

    댓글

Designed by Tistory.