ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Python] BeautifulSoup 사용하기
    언어/파이썬 & 장고 2019. 1. 18. 21:28

    웹 크롤러를 만들거나 html에서 필요한 정보를 검색할 때, BeautifulSoup 라이브러리를 사용하여 편리하게 코딩할 수 있습니다.

    설치

    $ pip3 install beautifulsoup4

    beautifulsoup에는 기본적으로 파이썬 표준라이브러리인 html 파서를 지원하지만, lxml이라는 모듈이 더 빠르게 동작하므로 lxml 모듈도 설치해 줍니다.

    $ pip3 install lxml


    아래는 beautifulsoup에서 사용할 수 있는 파서의 장단점을 보여주는 테이블 입니다.

    Parser선언방법장점단점
    파이썬 html.parserBeautifulSoup(markup, 'html.parser')

    설치할 필요 없음

    적당한 속도


    lxml HTML parserBeautifulSoup(markup, 'lxml')매우 빠름lxml 추가 설치 필요
    lxml XML parser

    BeautifulSoup(markup, 'lxml-xml')

    BeautifulSoup(markup, 'xml')

    매우 빠름

    유일하게 지원되는 xml parser

    lxml 추가 설치 필요
    html5libBeautifulSoup(markup, 'html5lib')

    웹 브라우저와 같은 방식으로 페이지를 파싱

    유효한 HTML5 생성

    html5lib 추가 설치 필요

    매우 느림

    사용법

    기본 선언 및 테스트 HTML은 아래와 같습니다.

    from bs4 import BeautifulSoup
    
    html = """
    <!DOCTYPE html>
    <html>
    
    <head>
       <title>Page title</title>
    </head>
    
    <body>
       <div>
          <p>a</p>
          <p>b</p>
          <p>c</p>
       </div>
       <div class="ex_class">
          <p>d</p>
          <p>e</p>
          <p>f</p>
       </div>
       <div id="ex_id">
          <p>g</p>
          <p>h</p>
          <p>i</p>
       </div>
       <h1>This is a heading</h1>
       <p>This is a paragraph.</p>
       <p>This is another paragraph.</p>
       <a href="http://brownbears.tistory.com" class="a"/>
    </body>
    
    </html>
    """
    
    
    bs = BeautifulSoup(html, 'lxml')

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

    조건에 맞는 태그를 가져옵니다. 만약 조건에 맞는 태그가 1개 이상이면 가장 첫 번째 태그를 가져옵니다.

    result = bs.find('p')
    print(result)
    
    
    # <p>a</p>

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

    조건에 맞는 모든 태그들을 가져옵니다.

    result = bs.find_all('p')
    print(result)
    
    # [<p>a</p>, <p>b</p>, <p>c</p>, <p>d</p>, <p>e</p>, <p>f</p>, <p>g</p>, <p>h</p>, <p>i</p>, <p>This is a paragraph.</p>, <p>This is another paragraph.</p>]

    class 명으로 찾기

    result = bs.find('div', class_='ex_class')
    print(result)
    
    
    # <div class="ex_class">
    # <p>d</p>
    # <p>e</p>
    # <p>f</p>
    # </div>

    id 명으로 찾기

    result = bs.find('div', id='ex_id')
    print(result)
    
    
    # <div id="ex_id">
    # <p>g</p>
    # <p>h</p>
    # <p>i</p>
    # </div>

    해당 태그명 출력

    result = bs.find('div', id='ex_id')
    print(result.name)
    
    # div

    해당 id명 출력

    result = bs.find('div', id='ex_id')
    print(result['id'])
    
    # ex_id

    해당 class명 출력

    result = bs.find('div', class_='ex_class')
    print(result['class'])
    
    
    # ex_class

    태그 사이에 있는 내용 출력

    result = bs.find('div', class_='ex_class')
    print(result.p.text)
    
    # d
    
    result = bs.find('div', class_='ex_class')
    
    
    # 검색된 div 태그 내의 모든 p태그를 조회
    for tag in result.find_all('p'):
        print(tag.text)
    
    # d
    # e
    # f

    태그 내의 속성값 출력

    result = bs.find('a', class_='a')
    print(result.get('href'))
    # http://brownbears.tistory.com


    위에서 설명한 방법만으로 충분히 HTML을 파서할 수 있습니다. 더 자세한 내용은 https://www.crummy.com/software/BeautifulSoup/bs4/doc/ 에서 확인할 수 있습니다.

    댓글