Selenium을 이용해 테이블 내의 데이터를 읽으려고 한다.
그러기 위해서는 먼저 HTML에서 테이블을 구성하는 방법에 대해 알아야 한다.
HTML - Table Tag
HTML에서 Table을 구성하는 태그는 아래와 같다.
태그 | 설명 |
<table> | 행과 열로 구성된 2차원 테이블을 정의 |
<thead> | HTML 테이블에서 헤더 콘텐츠(header content)들을 하나의 그룹으로 묶을 때 사용 |
<th> | HTML 테이블에서 제목이 되는 헤더 셀(header cell)을 정의할 때 사용 |
<tbody> | HTML 테이블에서 내용 콘텐츠(body content)들을 하나의 그룹으로 묶을 때 사용 |
<tr> | 테이블에서 셀들로 이루어진 하나의 행(row)을 정의할 때 사용 |
<td> | HTML 테이블에서 하나의 데이터 셀(data cell)을 정의할 때 사용 |
<tfoot> | HTML 테이블에서 푸터 콘텐츠(footer content)들을 하나의 그룹으로 묶을 때 사용 |
각 태그를 적절히 이용하면 아래 예시와 같은 테이블을 구성할 수 있다.
예시)
위 사진의 테이블을 구성하는 HTML은 아래와 같다.
table, td {
border: 1px solid #333;
}
thead, tfoot {
background-color: #333;
color: #fff;
}
<table>
<thead>
<tr>
<th colspan="2">The table header</th>
</tr>
</thead>
<tbody>
<tr>
<td>The table body</td>
<td>with two columns</td>
</tr>
<tr>
<td>The table body</td>
<td>with two columns</td>
</tr>
</tbody>
<tfoot>
<tr>
<td colspan="2">The table footer</td>
</tr>
</tfoot>
</table>
즉, table은 thead, tbody, tfoot 영역으로 구성될 수 있다. 각 영역은 여러 열(tr)로, 하나의 열(tr)은 여러 칸(td)으로 구성되어 있다.
Selenium - Table 읽기
selenium으로 테이블을 읽는 방법은 구조를 파악했으면 어렵지 않게 유추할 수 있다.
table element에 먼저 접근한 뒤, 필요에 따라 thead, tbody, tfoot 영역에 접근하고 순서대로 tr, td 요소에 접근한다. 즉, 반복문을 이용하면 된다. 테이블의 모든 데이터가 필요한 게 아니면 적절히 접근 영역을 조절하도록 한다.
코드
table 요소의 하위 요소는 tag 이름으로 찾아들어간다.
from selenium import webdriver
driver_path = 'PATH'
driver = webdriver.Chrome(driver_path)
# table element 접근. 찾는 속성은 적절하게 고려한다.
table = driver.find_element_by_xpath("TABLE_XPATH")
# thead
thead = table.find_element_by_tag_name("thead")
# thead > tr > th
thead_th = thead.find_element_by_tag_name("tr").find_elements_by_tag_name("th")
for th in thead_th:
print(th.text) # text 속성 읽기
# tbody
tbody = table.find_element_by_tag_name("tbody")
# tbody > tr > td
for tr in tbody.find_elements_by_tag_name("tr"):
for td in tr.find_elements_by_tag_name("td"):
print(td.get_attribute("innerText"))
# tfoot
tfoot = table.find_element_by_tag_name("tfoot")
thead_th = tfoot.find_element_by_tag_name("tr").find_element_by_tag_name("td")
예시)
실행 예시로 https://finance.daum.net/domestic의 표 일부를 읽으려고 한다. 아래 사진과 같이 tbody 영역만을 읽어보려고 한다.
코드
from selenium import webdriver
driver_path = 'D:\projects\selenium_test\driver\chromedriver.exe'
driver = webdriver.Chrome(driver_path)
url = "https://finance.daum.net/domestic"
driver.get(url)
# table
table = driver.find_element_by_xpath('//*[@id="boxMarketTrend"]/div[3]/div[1]/table')
# tbody
tbody = table.find_element_by_tag_name("tbody")
for tr in tbody.find_elements_by_tag_name("tr")[:5]:
txt = tr.find_element_by_tag_name("th").get_attribute("innerText")
for td in tr.find_elements_by_tag_name("td")[:3]:
txt += " " + td.get_attribute("innerText")
print(txt)
실행 결과