바닥코딩
Beautifulsoup를 통해 HTML 파싱하기 본문
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 |