위 구조를 파악하고 이를 크롤링 해 데이터프레임으로 담아보자.

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

+ Recent posts