Python

[Selenium] 테이블 읽기

비번변경 2021. 11. 6. 20:17

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)

 

실행 결과

읽은 테이블 출력