바닥코딩

Beautifulsoup를 통해 HTML 파싱하기 본문

파이썬 데이터 크롤링

Beautifulsoup를 통해 HTML 파싱하기

개발공부개발공부 2020. 1. 3. 15:14

BeaurifulSoup

 

 파이썬으로 웹을 크롤링 한 후 HTML로 부터 원하는 데이터를 가져올 떄 , parsing 을 효울적으로 수행하는 모듈입니다여기서 parsing이라는 단어의 의미는 HTML을 분석한다는 의미로 해석됩니다    

 일단 BeautifulSoup 를 설치하기 위해선 pip install beautifulsoup4 명령어를 터미널에 입력하면 설치가 가능합니다.

from bs4 import BeautifulSoup

 설치가 완료 되면 위에 문장을 통해 해당 모듈을 import 할 수 있게 되는데, 그 다음 크롤링을 원하는 웹페이지의 url을  urllib 모듈을 통해 소스를 가져올 수 있습니다

import urllib.request
import urllib.parse

# web_url에 원하는 웹의 URL을 넣어주시면 됩니다.
with urllib.request.urlopen(web_url) as response:
    html = response.read()
    soup = BeautifulSoup(html, 'html.parser')

BeautifulSoup 내장함수

 위 과정을 통해 해당 URL에 정보를 가져와  parsing을 거쳤다면 내장함수를 통해 태그 데이터를 제어할 수 있습니다 . 이에 대표적인 내장함수들을 살펴보면 

1.find() 및 find_all() 함수 

  find() : 해당 조건에 맞는 하나의 태그를 가져오며 중복일 경우 가장 첫 번째 태그를 가져온다 

  find_all() : 해당 조건에 맞는 모든 태그들을 가져온다 

 2. 태그와 속성을 통해 데이터 가져오기 

 태그와 속성을 이용할 때 함수의 인자로 원하는 태그를 첫번째 인자로 그 안의 속성 : 값 의 형태로 딕셔너리 형태로 넣어주면 데이터 가져오기가 가능합니다                                                                                                        

with open("example.html") as fp:
    soup = BeautifulSoup(fp, 'html.parser')
    ex_id_divs = soup.find('div', {'id' : 'ex_id'})
    print(ex_id_divs)

3.select를 통해 데이터 가져오기

 select 내장함수를 사용하여 해당 사이트 html의 경로를 지정하여 데이터 크롤링이 가능하게 되는데   경로 지정은 태그 외쪽부터 내부 로 '>' 로 지정합니다.

req = requests.get('https://beomi.github.io/beomi.github.io_old/')
html = req.text
soup = BeautifulSoup(html, 'html.parser')
my_titles = soup.select(
    'h3 > a'
    )

아래 코드는 전력데이터 개방 포털시스템에서 일부 항목을 크롤링 하는 코드의 전문입니다

from urllib.request import urlopen
from urllib.request import HTTPError
from bs4 import BeautifulSoup
import re



try :
    url = urlopen("http://bigdata.kepco.co.kr/cmsmain.do?scode=S01&pcode=000166")
except HTTPError as e :
    print(e)
else: 
    bsobj = BeautifulSoup(url.read(), "html.parser")

    namelist = ["leg1","leg2","leg3","leg4","leg5","leg6","leg7","leg8","leg9","leg10","leg11","leg12","leg13","leg14",
    "leg15","leg16","leg17","leg18","leg19","leg20","leg21"]
    

    name = str(bsobj.find('span', class_="leg1"))
    name = re.sub('<span.+?<b','',name,0)
    name = re.sub('</b.+?</span>','',name,0)
    name = re.sub('< b="">','',name,0)
    
    print(name)

    name = str(bsobj.find('span', class_="leg2"))
    name = re.sub('<span.+?<b','',name,0)
    name = re.sub('</b.+?</span>','',name,0)
    name = re.sub('< b="">','',name,0)
    name = re.sub(' <="" b="">','',name,0)
    
    print(name)

    name = str(bsobj.find('span', class_="leg3"))
    name = re.sub('<span.+?<b','',name,0)
    name = re.sub('</b.+?</span>','',name,0)
    name = re.sub('< b="">','',name,0)
    name = re.sub(' <="" b="">','',name,0)
    name = re.sub(' b="" ','',name,0)
    name = re.sub('="" ','',name,0)
    name = re.sub('<="">','',name,0)

    print(name)
 
 
    name = str(bsobj.find('span', class_="leg4"))
    name = re.sub('<span.+?<b','',name,0)
    name = re.sub('</b.+?</span>','',name,0)
    name = re.sub('< b="">','',name,0)
    name = re.sub(' <="" b="">','',name,0)
    name = re.sub(' b="" ','',name,0)
    name = re.sub('="" ','',name,0)
    name = re.sub('<="">','',name,0)
    print(name)

    name4 = str(bsobj.find('span', class_="leg4"))
    def delete_tag(name):
          name = re.sub('<span.+?<b','',name,0)
          name = re.sub('</b.+?</span>','',name,0)
          name = re.sub('< b="">','',name,0)
          name = re.sub(' <="" b="">','',name,0)
          name = re.sub(' b="" ','',name,0)
          name = re.sub('="" ','',name,0)
          name = re.sub('<="">','',name,0)

          return name

    print(delete_tag(name4))

 

'파이썬 데이터 크롤링' 카테고리의 다른 글

csv 파일 데이터 셋 받아오기 및 시각화  (0) 2020.01.04
pandas를 이용한 데이터 시각화  (0) 2020.01.03
selenium(셀레늄)  (0) 2020.01.03
JSON  (1) 2020.01.03
데이터 크롤링  (0) 2020.01.03