위 구조를 파악하고 이를 크롤링 해 데이터프레임으로 담아보자.
cf.
<thead> 태그는 표의 컬럼헤더를 담고,
<tbody> 태그는 표의 데이터를 담는다.
다시 안으로 들어가보면
<tr> 태그는 row(행)을 만들고,
각 행에는 <th>(또는 <td>) 만큼의 column(열)이 있다. (th : header의 열을 생성, td : body의 열을 생성)
1. 우선 원하는 영역을 담아보자.
import requests, bs4
import pandas as pd
url = "https://sparkkorea.com/테스트/"
response = requests.get(url).text.encode('utf-8')
response = bs4.BeautifulSoup(response, 'html.parser')
target = response.find('table', {'id':'test_table', 'class':'type07'})
target
결과 :
<table class="type07" id="test_table">
<thead>
<tr>
<th scope="cols">학번</th>
<th scope="cols">이름</th>
</tr>
</thead>
<tbody>
<tr>
<td>101</td>
<td>김효관</td>
</tr>
<tr>
<td>102</td>
<td>이순신</td>
</tr>
<tr>
<td>103</td>
<td>김어진</td>
</tr>
</tbody>
</table>
2. 컬럼헤더를 분리시키자.
thead = target.find_all('th')
theadList = []
theadLen = len(thead)
for i in range(0,theadLen):
thead = target.find_all('th')[i].text
theadList.append(thead)
theadList
결과 :
['학번', '이름']
3.1 body 데이터를 담기 위해 하나씩 들어가보자.
tbody = target.find('tbody')
tbody
결과 :
<tbody>
<tr>
<td>101</td>
<td>김효관</td>
</tr>
<tr>
<td>102</td>
<td>이순신</td>
</tr>
<tr>
<td>103</td>
<td>김어진</td>
</tr>
</tbody>
------------------------------------------------------------------------------------
trData = tbody.find_all('tr')
trData
결과 :
[<tr>
<td>101</td>
<td>김효관</td>
</tr>,
<tr>
<td>102</td>
<td>이순신</td>
</tr>,
<tr>
<td>103</td>
<td>김어진</td>
</tr>]
------------------------------------------------------------------------------------
tdData = trData[0].find_all('td')
tdData
결과 :
[<td>101</td>, <td>김효관</td>]
------------------------------------------------------------------------------------
tdData[0].text
결과 :
'101'
3.2 반복문으로 담아보자.
rowList = []
columnList = []
trDataLen = len(trData)
for i in range(0,trDataLen):
tdData = trData[i].find_all('td')
tdDataLen = len(tdData)
for j in range(0,tdDataLen):
element = tdData[j].text
columnList.append(element)
rowList.append(columnList)
columnList = []
rowList
결과 :
[['101', '김효관'], ['102', '이순신'], ['103', '김어진']]
4. Pandas로 DataFrame 만들기
result = pd.DataFrame(rowList, columns=theadList)
result
완성본
더보기
1. 순차적으로 하나씩 열어나간 위의 일반적 방법.
import requests, bs4
import pandas as pd
# 1. 코드 담아내고 영역 분리.
url = "https://sparkkorea.com/테스트/"
response = requests.get(url).text.encode('utf-8')
response = bs4.BeautifulSoup(response, 'html.parser')
target = response.find('table', {'id':'test_table', 'class':'type07'})
# target # 디버깅용.
# 2. 컬럼헤더 분리.
thead = target.find_all('th')
theadList = []
theadLen = len(thead)
for i in range(0,theadLen):
thead = target.find_all('th')[i].text
theadList.append(thead)
# theadList # 디버깅용.
# 3. body 데이터 분리.
tbody = target.find('tbody')
# tbody # 디버깅용.
trData = tbody.find_all('tr')
# trData # 디버깅용.
tdData = trData[0].find_all('td')
# tdData # 디버깅용.
# tdData[0] # 디버깅용.
rowList = []
columnList = []
trDataLen = len(trData)
for i in range(0,trDataLen):
tdData = trData[i].find_all('td')
tdDataLen = len(tdData)
for j in range(0,tdDataLen):
element = tdData[j].text
columnList.append(element)
rowList.append(columnList)
columnList = []
# rowList # 디버깅용. # [['101', '김효관'], ['102', '이순신'], ['103', '김어진']]
# 4. 데이터프레임 만들기.
result = pd.DataFrame(rowList, columns=theadList)
result
2. 나머지 연산자 활용. (3.1 ~ 3.2 과정의 변형)
rowList = []
columnList = []
trDataLen = len(trData)
for i in range(0,trDataLen):
tdData = trData[i].find_all('td')
tdDataLen = len(tdData)
for j in range(0,tdDataLen):
element = tdData[j].text
columnList.append(element)
rowList.append(columnList)
columnList = []
rowList
결과 :
[['101', '김효관'], ['102', '이순신'], ['103', '김어진']]
대신에
rowList = []
columnList =[]
tdTagsLen = len(tdTags)
for i in range(0,tdTagsLen):
element = tdTags[i].text
columnList.append(element)
if i % 2 == 1:
rowList.append(columnList)
columnList = []
rowList
결과 :
[['101', '김효관'], ['102', '이순신'], ['103', '김어진']]
를 사용했다.
import requests, bs4
import pandas as pd
# 1. 코드 담아내고 영역 분리.
url = "https://sparkkorea.com/테스트/"
response = requests.get(url).text.encode('utf-8')
response = bs4.BeautifulSoup(response, 'html.parser')
target = response.find('table', {'id':'test_table', 'class':'type07'})
# target # 디버깅용.
# 2. 컬럼헤더 분리
thead = target.find_all('th')
theadList = []
theadLen = len(thead)
for i in range(0,theadLen):
thead = target.find_all('th')[i].text
theadList.append(thead)
# theadList # 디버깅용.
# 3. body 데이터 분리
tdTags = target.find_all('td')
# tdTags # 디버깅용.
rowList = []
columnList =[]
tdTagsLen = len(tdTags)
for i in range(0,tdTagsLen):
element = tdTags[i].text
columnList.append(element)
if i % 2 == 1:
rowList.append(columnList)
columnList = []
rowList
# rowList # 디버깅용. # [['101', '김효관'], ['102', '이순신'], ['103', '김어진']]
# 4. 데이터프레임 만들기.
result = pd.DataFrame(rowList, columns=theadList)
result
'개발자 > HTML' 카테고리의 다른 글
자바스크립트 HTML 연습 (0) | 2020.07.01 |
---|---|
HTML 테이블 생성기 (0) | 2020.06.18 |
자바 HTML (0) | 2020.05.29 |
HTML CSS (0) | 2020.04.16 |
HTML 태그 구조 (0) | 2020.04.15 |