반응형

셀레니움, text, innerText, innerHTML 차이, 테이블 예제 비교

글. 수알치 오상문

text : property (프라퍼티)

[사용]

요소객체.text

innerHTML, innerHTML : attribute (속성)

[사용]

요소객체.get_attribute("innerText")

요소객체.get_attribute("innerHTML")

일반적으로 둘은 같은 값을 가져오지만 근본적인 차이점이 있다.

먼저 사용 방식부터 다르다.

text는 객체 프라퍼티이기에 요소.text 방식으로 접근한.

innerText, innerHTML은 요소 이름이기에 get_attribute() 함수를 이용하여 접근한다.

[참고] property나 attribute는 번역하면 둘 다 '속성'이다.

둘을 구분하기 위해 attribute는 속성, property는 프라퍼티라고 부르겠다.

1. text

text : 요소의 텍스트 값을 가져온다.

def text(self):

"""The text of the element."""

return self._execute(Command.GET_ELEMENT_TEXT)['value']

예제: 요소의 텍스트 값을 가져온다.

y_text = target_element.text

2. get_attribute("innerText")

get_attribute(innerText) : 요소의 innerText 값을 가져오는데, 없으면 None 반환한다.

이 메서드는 주어진 이름을 가진 속성 값을 반환하려고 시도한다. 해당 이름을 가진 프라퍼티가 존재하지 않으면 같은 이름을 가진 속성 값을 반환하려고 한다. 그런데 해당하는 속성이 없으면 None이 반환한다.

- 참 또는 거짓으로 간주되는 값은 논리값으로 반환된다.

- None이 아닌 모든 값은 문자열로 반환된다.

- 존재하지 않는 프라퍼티나 속성이면 None이 반환된다.

예제: 요소의 텍스트 값 얻기 (내부 html 코드 포함 안함)

my_text = target_element.get_attribute("innerText")

[참고] 텍스트 값을 가져온다는 면에서 .text와 innerText는 같다. 그러나 innerText는 텍스트 이외에 다른 값(href, src 등)을 가져올 수도 있다.

3. get_attribute("innerHTML")

get_attribute(innerHTML) : 요소의 innerHTML 값을 가져오는데, 없으면 None 반환한다.

이 메서드는 주어진 이름을 가진 속성 값을 반환하려고 시도한다. 해당 이름을 가진 프라퍼티가 존재하지 않으면 같은 이름을 가진 속성 값을 반환하려고 한다. 그런데 해당하는 속성이 없으면 None이 반환한다.

- 참 또는 거짓으로 간주되는 값은 논리값으로 반환된다.

- None이 아닌 모든 값은 문자열로 반환된다.

- 존재하지 않는 프라퍼티나 속성이면 None이 반환된다.

예제: 요소의 텍스트 값 얻기 (포함된 html 코드도 포함)

my_text = target_element.get_attribute("innerHTML")

속성(Attributes) vs. 프라퍼티(properties)

브라우저가 웹 페이지를 로딩할 때, HTML 코드를 파싱하고 DOM 객체를 만들게 된다. 예를 들어, 다음 html 코드의 body 요소는 id가 "page"인데 이것은 DOM 객체 프라퍼티에 자동 등록된다. body.id="page

<body id="page">

테이블 예제로 비교하기

다음과 같은 table 코드가 있다고 하자.

<!DOCTYPE html>
<html lang="ko-kr">
<head>
<style>
table, td {
border: 1px solid #444;
}
thead, tfoot {
background-color: #aaa;
color: #111;
}
</style>
</head>
<body>
<h1> 테이블 예제 </h1>
<table>
<thead>
<tr>
<th colspan="2">음식 주문 차림표</th>
</tr>
</thead>
<tbody>
<tr>
<td><h5>비 빔 밥 (1번줄 1번째 칸)</h5></td>
<td>9000원 (1번줄 2번째 칸)</td>
</tr>
<tr>
<td><h5>김치찌개 (2번줄 1번째 칸)</h5></td>
<td>8000원 (2번줄 2번째 칸)</td>
</tr>
<tr>
<td><h5>된장찌개 (3번줄 1번째 칸)</h5></td>
<td>7000원 (3번줄 2번째 칸)</td>
</tr>
</tbody>
<tfoot>
<tr>
<th colspan="2">물은 셀프입니다.</td>
</tr>
</tfoot>
</table>
</body>
</html>

이런 테이블을 셀레니움으로 크롤링 해서 결과를 보여주는 파이썬 코드는 다음과 같다.

from selenium import webdriver

from selenium.webdriver.support.ui import WebDriverWait

from selenium.webdriver.common.by import By

from selenium.webdriver.chrome.service import Service

from webdriver_manager.chrome import ChromeDriverManager

import time

driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()))

WebDriverWait(driver, 3)

driver.get('http://127.0.0.1:5000/table')

WebDriverWait(driver, 5)

time.sleep(0.5)

table = driver.find_element(By.XPATH, '/html/body')

thead = table.find_element(By.TAG_NAME, "thead")

thead_th = thead.find_element(By.TAG_NAME, "tr").find_elements(By.TAG_NAME, "th")

try:

  for th in thead_th:

    print(th.text) # text 속성 읽어서 출력

except:

  pass

tbody = table.find_element(By.TAG_NAME, "tbody")

print()

print('.text 이용하기')

# .text 이용하기

for tr in tbody.find_elements(By.TAG_NAME, "tr"):

  for td in tr.find_elements(By.TAG_NAME, "td"):

    print(td.text)

 

print()

print('.get_attribute("innerText") 이용하기')

# .get_attribute("innerText")

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"))

 

print()

print('.get_attribute("innerHTML") 이용하기')

# .get_attribute("innerHTML")

for tr in tbody.find_elements(By.TAG_NAME, "tr"):

  for td in tr.find_elements(By.TAG_NAME, "td"):

    print(td.get_attribute("innerHTML"))

 

input("Quit? :")

driver.quit()

아래 실행 결과를 보면 .text 와 get_attribute("innerText") 결과는 차이가 없지만,

get_attribute("innerHTML") 결과에는 내부 html 코드까지 포함된 것을 볼 수 있다.

[실행 결과]

음식 주문 차림표

.text 이용하기

비 빔 밥 (1번줄 1번째 칸)

9000원 (1번줄 2번째 칸)

김치찌개 (2번줄 1번째 칸)

8000원 (2번줄 2번째 칸)

된장찌개 (3번줄 1번째 칸)

7000원 (3번줄 2번째 칸)

.get_attribute("innerText") 이용하기

비 빔 밥 (1번줄 1번째 칸)

9000원 (1번줄 2번째 칸)

김치찌개 (2번줄 1번째 칸)

8000원 (2번줄 2번째 칸)

된장찌개 (3번줄 1번째 칸)

7000원 (3번줄 2번째 칸)

.get_attribute("innerHTML") 이용하기

<h5>비 빔 밥 (1번줄 1번째 칸)</h5>

9000원 (1번줄 2번째 칸)

<h5>김치찌개 (2번줄 1번째 칸)</h5>

8000원 (2번줄 2번째 칸)

<h5>된장찌개 (3번줄 1번째 칸)</h5>

7000원 (3번줄 2번째 칸)

반응형

+ Recent posts