상단

BeautifulSoup


설치

# apt  install  python3-bs4
pip3  install  bs4
pip3  install  lxml
pip3  install  html5lib

사용법

import requests
from bs4 import BeautifulSoup

url = "https://finance.naver.com/"
res = requests.get(url)
soup = BeautifulSoup(res.text, "html.parser")    #--- HTML 파서
# soup = BeautifulSoup(res.text, "html.parser", multi_valued_attributes=None)
# soup = BeautifulSoup(res.text, "lxml")  #--- HTML 파서
# soup = BeautifulSoup(res.text, "xml")   #--- XML 파서

#--- 검색 : find(), find_all()
soup.find('~')                          #--- 태그 이름으로 태그 찾기
soup.find(id='~')                       #--- id로 태그 찾기
soup.find(class_='~')                   #--- class로 태그 찾기
soup.find('~', id='~', class_='~')

soup.find_all('a')                      #--- 모든 a 태그 
soup.find_all(['~', '~'])
soup.find_all(re.compile('~'))          #--- 정규 표현식으로 검색
soup.find_all(True)                     #--- 모든 태그

def has_class_but_no_id(tag):
    return tag.has_attr('class') and not tag.has_attr('id')
soup.find_all(has_class_but_no_id)

#--- 검색 : select()
#---     CSS Selector 사용
#---     https://www.jopenbusiness.com/mediawiki/CSS3
soup.select('~')

#--- 태그 탐색
soup.next_sibling                       #--- 다음 형제 태그
soup.next_siblings                      #--- iterate
soup.previous_sibling                   #--- 이전 형제 태그
soup.previous_siblings                  #--- iterate

soup.~                                  #--- 첫번째 ~ 자식 태그
soup.contents                           #--- 자식 태그 배열
soup.children                           #--- 자식 태그 iterate
# for child in soup.children:
soup.descendants                        #--- 모든 자식 태그 탐색용 iterate
# len(list(soup.descendants))

soup.parent                             #--- 부모 태그
soup.parents                            #--- 모든 부모 태그 iterate

soup.next_element                       #--- 다음 태그
soup.next_elements
soup.previous_element                   #--- 이전 태그
soup.previous_elements

#--- 태그 탐색
#---     class와 같이 여러값을 가질수 있는 속성값은 배열에 담겨 반환 한다.
#---     multi_valued_attributes=None을 사용하며 배열이 아니라 값으로 반환 한다.
soup.name                               #--- 태그 이름
soup.['~']                              #--- 속성값
soup.get('~')                           #--- 속성값
soup.attrs                              #--- 속성값을 저장한 객체
del  soup.['~']                         #--- 속성값 삭제

soup.string                             #--- 태그의 내용
unicode(soup.string)                    #--- Unicode 문자열로 태그의 내용을 반환
soup.string.replace_with('~')           #--- 태그의 내용을 ~로 대체
soup.strings
soup.stripped_strings

샘플

# -*- coding: utf-8 -*-
#   Author          : gye hyun james kim [pnuskgh@gmail.com]
#   Copyright (c) 2018 ~ 2019, OBCon Inc. All rights reserved.

import sys
import traceback

import requests
from bs4 import BeautifulSoup

class Crawling:
    def __init__(self, List, p_str=None):
        pass

    def __del__(self):
        pass

    def run(self):
        self.getXml001()

    def getHtml001(self):
        url = "https://finance.naver.com/"
        res = requests.get(url)
        soup = BeautifulSoup(res.text, "html.parser")

        data = soup.select("#container > div.aside > div.group_aside > div.aside_area.aside_stock > table > tbody > tr")
        for item in data:
            print('-', item.find('th').text, end="\t")
            print(item.find_all('td')[0].text, end="\t")
            print(item.find_all('td')[1].text)
        print()

        data = soup.select("#container > div.aside > div.group_aside > div.aside_area.aside_popular > table > tbody > tr")
        for item in data:
            print('-', item.find('th').text, end="\t")
            print(item.find_all('td')[0].text, end="\t")
            print(item.find_all('td')[1].text)
        print()

    #--- WSDL 반환
    # end_point = 'http://openapi.molit.go.kr/OpenAPI_ToolInstallPackage/service/rest/RTMSOBJSvc/getRTMSDataSvcLandTrade?_wadl&type=xml'
    def getXml001(self):
        #--- 토지 매매 신고 조회 서비스
        end_point = 'http://openapi.molit.go.kr/OpenAPI_ToolInstallPackage/service/rest/RTMSOBJSvc/getRTMSDataSvcLandTrade'
        ServiceKey = '인증키'
        LAWD_CD = '11110'                               #--- LAWD_CD, 각 지역별 코드
        DEAL_YMD = '201512'                            #--- DEAL_YMD, 월 단위 신고자료

        url = end_point + '?ServiceKey=' + ServiceKey
        url = url + '&LAWD_CD=' + LAWD_CD
        url = url + '&DEAL_YMD=' + DEAL_YMD
        url = url + '&pageNo=1'
        url = url + '&numOfRows=10'
        res = requests.get(url)
        soup = BeautifulSoup(res.text, "xml")

        resultCode = soup.find('resultCode')
        resultMsg = soup.find('resultMsg')
        print(resultCode.string, resultMsg.string)

        data = soup.find_all('item')
        for item in data:
            print(item.법정동.string)

if __name__ == "__main__":
    try:
        app = Crawling(sys.argv)
        app.run()
    except KeyboardInterrupt:
        print(traceback.format_exc())

참고 문헌

최종 수정일: 2024-09-30 12:26:18

이전글 :
다음글 :