ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Python: BeautifulSoup 라이브러리 정리(find, find_all, 태그, 클래스, id, 속성)
    Python 2021. 6. 2. 23:14

    BeautifulSoup란?

    인터넷 문서의 구조에서 명확한 데이터를 추출하고 처리하는 가장 쉬운 라이브러리 

     

    1. find로 태그 추출하기 

    find(name, attrs, recursive, string, **kwargs)

    from urllib.request import urlopen
    from bs4 import BeautifulSoup
    a = urlopen('https://www.naver.com/')
    # a를 호출해 html을 parser
    soup = BeautifulSoup(a.read(), 'html.parser')
    # soup에서 h1 tag 하나를 가져온다.
    print(soup.find('h1'))
    <h1 class="logo_default">
    <a class="logo_naver" data-clk="top.logo" href="/"><span class="blind">네이버</span></a>
    </h1>

     

     

    from urllib.request import urlopen
    from bs4 import BeautifulSoup
    a = urlopen('https://www.naver.com/')
    # a를 호출해 html을 parser
    soup = BeautifulSoup(a.read(), 'html.parser')
    # soup에서 h1 tag 하나를 가져온다.
    print(soup.h1)
    <h1 class="logo_default">
    <a class="logo_naver" data-clk="top.logo" href="/"><span class="blind">네이버</span></a>
    </h1>

     

     

     

    2. find_all로 해당 태그 모두 추출하기 

    find_all(name, attrs, recursive, string, **kwargs)

    기준에 맞는 태그를 모두 가져오기 때문에 리스트 타입을 반환한다. 

     

    from urllib.request import urlopen
    from bs4 import BeautifulSoup
    a = urlopen('https://www.naver.com/')
    # a를 호출해 html을 parser
    soup = BeautifulSoup(a.read(), 'html.parser')
    # soup에서 div tag를 모두 가져온다.
    print(soup.find_all('div'))
    </div>
    <div class="atcmp_footer">
    <span class="side_opt_area">
    <span class="opt_item"><a data-clk="sly.help" href="https://help.naver.com/support/service/main.help?serviceNo=605&amp;categoryNo=1991" target="_blank">도움말</a></span>
    </span>
    <span class="rside_opt_area">
    <span class="opt_item">
    <!-- [AU] _keywordOnOff 클래스를 추가해주세요. -->
    <a class="close _keywordOnOff" href="#">자동저장 끄기</a>
    </span>
    </span>
    </div>
    </div>
    ...

     

     

     

    1) 해당 태그의 class를 기준으로 호출하기 

    from urllib.request import urlopen
    from bs4 import BeautifulSoup
    a = urlopen('https://www.naver.com/')
    # a를 호출해 html을 parser
    soup = BeautifulSoup(a.read(), 'html.parser')
    # soup에서 div tag의 class가 corp_area인 태그를 가져온다.
    b = soup.find_all("div", "corp_area")
    print(b)
    [<div class="corp_area" data-clk-prefix="plc"> <h3 class="blind">네이버 정책 및 약관</h3> <ul class="list_corp"> <li class="corp_item"><a data-clk="intronhn" href="https://www.navercorp.com">회사소개</a></li> <li class="corp_item"><a data-clk="recruit" href="https://recruit.navercorp.com/naver/recruitMain">인재채용</a></li> <li class="corp_item"><a data-clk="contact" href="https://www.navercorp.com/naver/proposalGuide">제휴제안</a></li> <li class="corp_item"><a data-clk="service" href="/policy/service.html">이용약관</a></li> <li class="corp_item"><a data-clk="privacy" href="/policy/privacy.html"><strong>개인정보처리방침</strong></a></li> <li class="corp_item"><a data-clk="youth" href="/policy/youthpolicy.html">청소년보호정책</a></li> <li class="corp_item"><a data-clk="policy" href="/policy/spamcheck.html">네이버 정책</a></li> <li class="corp_item"><a data-clk="helpcenter" href="https://help.naver.com/">고객센터</a></li> </ul> <address class="addr"><a data-clk="nhn" href="https://www.navercorp.com" target="_blank">ⓒ NAVER Corp.</a></address> </div>]

     

     

    2) 해당 태그의 id를 기준으로 호출하기 

    from urllib.request import urlopen
    from bs4 import BeautifulSoup
    a = urlopen('https://www.naver.com/')
    # a를 호출해 html을 parser
    soup = BeautifulSoup(a.read(), 'html.parser')
    # soup에서 div tag의 속성 중 id가 account인 태그를 모두 가져온다. 
    c = soup.find_all('div', {'id': 'account'})
    print(c)
    [<div class="sc_login" id="account">
    <h2 class="blind">Sign in</h2>
    <p class="login_msg">Connect with people</p>
    <a class="link_login" data-clk="log_off.login" href="https://nid.naver.com/nidlogin.login?mode=form&amp;url=https%3A%2F%2Fwww.naver.com"><i class="ico_naver"><span class="blind">NAVER</span></i>Sign in</a>
    <div class="sub_area">
    <div class="look_box">
    <a class="link_look" data-clk="log_off.searchid" href="https://nid.naver.com/user/help.nhn?todo=idinquiry">Forgot Username</a>
    <a class="link_look" data-clk="log_off.searchpass" href="https://nid.naver.com/nidreminder.form">Password</a>
    </div>
    <a class="link_join" data-clk="log_off.registration" href="https://nid.naver.com/nidregister.form?url=https%3A%2F%2Fwww.naver.com">Sign up</a>
    </div>
    </div>]

     

     

     

    3. text 추출하기 

    from urllib.request import urlopen
    from bs4 import BeautifulSoup
    a = urlopen('https://www.naver.com/')
    # a를 호출해 html을 parser
    soup = BeautifulSoup(a.read(), 'html.parser')
    
    d = soup.find('div', {'id': 'account'})
    # tag의 text만 추출한다. 
    print(d.text)
    
    # find_all로 가져오면 리스트형태로 가져오기 때문에
    # 개별값에 대해서 text를 해주어야 한다.
    Sign in
    Connect with people
    NAVERSign in
    
    
    Forgot Username
    Password
    
    Sign up
    
    

     

     

     

    4. 음악 순위 크롤링하기 

    from urllib.request import urlopen
    from bs4 import BeautifulSoup
    url = urlopen("https://music.bugs.co.kr/chart?wl_ref=M_left_02_01")
    soup = BeautifulSoup(url.read(), 'html.parser')
    # td 태그에 check라는 class가 있는 td 태그를 모두 가져온다.
    musics = soup.find_all('td', "check")
    # musics의 각 태그들에 대해서 
    for i, music in enumerate(musics):
        # input 태그안에 title 속성값을 parsing한다. 
        print("{}위: {}".format(i+1, music.input['title']))
        # print("{}위: {}".format(i + 1, music.find('input')['title']))
    1위: Butter
    2위: Next Level
    3위: 안녕 (Hello)
    4위: 헤픈 우연
    5위: Dun Dun Dance
    .
    .
    .
    95위: 살다가
    96위: METEOR
    97위: 잠이 오질 않네요
    98위: 다정히 내 이름을 부르면
    99위: Bang!
    100위: 너의 발걸음에 빛을 비춰줄게 (Prod. 조영수)

     

    반응형

    댓글

Designed by Tistory.