셀레니움, 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">
|
<!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번째 칸)
'웹 크롤링, 스크래핑' 카테고리의 다른 글
BeautifulSoup 기초 (0) | 2022.07.10 |
---|---|
셀레니움, 요소(어트리뷰트) 속성 검사, 설정, 삭제 (0) | 2022.07.10 |
셀레니움, get_attribute()로 속성 값 얻기 (0) | 2022.07.10 |
셀레니움, XPath로 요소 찾기 표현식 (0) | 2022.07.10 |
셀레니움, HTML Table 구조 읽기 (0) | 2022.07.10 |