HTML & CSS

[48-2 Selenium] 특정 HTML 요소 찾기, get, find_element, by 클래스, ID, Class name, css selector, Xpath

Olivia-BlackCherry 2022. 10. 23. 21:48

셀레늄은 브라우저를 구동한다. 

브라우저는 이미 많은 정보를 전송하고 있기 때문에, 

코드에 헤더, 패키지 등 상당 부분을 적지 않아도 된다. 

뷰티풀 수프보다 더 짧은 코드로, 더 많은 작업을 할 수 있다. 

 

셀레늄은 사람이 실제로 웹사이트를 조작하는 방식과 같게 작동하므로

여러 작업을 보다 효과적으로 처리할 수 있다. 

 

 

get()

WebDriver를 가지고 URL에서 정보를 가져오기 위해 get메서드를 쓴다.

 

find_element()

특정 HTML요소를 찾아서 가져오고 싶을 때 쓴다. 

우선  아래처럼 By를 임포트한다.

from selenium.webdriver.common.by import By

By클래스에서 사용할 수 있는 속성은 아래와 같다. 

ID = "id"
NAME = "name"
XPATH = "xpath"
LINK_TEXT = "link text"
PARTIAL_LINK_TEXT = "partial link text"
TAG_NAME = "tag name"
CLASS_NAME = "class name"
CSS_SELECTOR = "css selector"

By 클래스는 한 페이지에서 특정한 요소의 위치를 파악하는데 쓰이는데, 

아래와 같이 코드를 쓰면 된다. 

find_element(By.ID, "id")
find_element(By.NAME, "name")
find_element(By.XPATH, "xpath")
find_element(By.LINK_TEXT, "link text")
find_element(By.PARTIAL_LINK_TEXT, "partial link text")
find_element(By.TAG_NAME, "tag name")
find_element(By.CLASS_NAME, "class name")
find_element(By.CSS_SELECTOR, "css selector")

 

 

 

< 예시1 >

class가 설정되어 있는 경우

원하는 웹사이트를 연다.

from selenium import webdriver
chrome_driver_path = "C:\developer\chromedriver.exe"

#새 드라이버 만들기
driver = webdriver.Chrome(executable_path=chrome_driver_path)
URL = "https://www.amazon.com/GoPro-MAX-Waterproof-Traditional-microSDHC/dp/B07Z7C8BXR/ref=sr_1_4?crid=L9H2IOZCTCQD&keywords=gopro%2Bmax&qid=1666303865&qu=eyJxc2MiOiIzLjcwIiwicXNhIjoiMy41NyIsInFzcCI6IjMuMTcifQ%3D%3D&sprefix=gopro%2Bma%2Caps%2C419&sr=8-4&th=1"
#웹페이지 열기
driver.get(URL)

 

아래의 웹사이트에서 가격(449달러) 만 가져온다고 했을 때,

셀레늄을 이용하여 웹페이지의 해당  HTML 요소를 찾아보자.

 

가격이 표시된 곳에 오른쪽 마우스를 클릭하고, 검사를 클릭한다.

 

1) class name으로 가져오기

가격이 class = 'a-price-whole'로 지정되어 있다. 

아래와 같이 특정 요소를 find_element로 찾아서 print해보면

HTML을 바로 제공하는 것이 아니라, 

셀레늄 요소를 제공한다는 것을 알 수 있다. 

price = driver.find_element(By.CLASS_NAME, "a-price-whole")
print(price)

 

다양한 속성, 텍스트, 태그 이름을 이용하는 경우

점 . 을 이용해야 한다.

.text
.get_attribute("속성이름")
.tag_name

등으로 HTML을 가져온다. 

#특정 HTML요소 찾기
price = driver.find_element(By.CLASS_NAME, "a-price-whole")
print(price.text)

>>449

 

 

 

< 예시2 > 

name이 있는 경우

 

URL = "https://www.python.org"

웹사이트에서 HTML을 확인한다.

 

2) name으로 가져오기

#웹페이지 열기
URL_python = "https://www.python.org"
driver.get(URL_python)

#특정 HTML요소 찾기
search_bar = driver.find_element(By.NAME, "q")
print(search_bar)
driver.quit()

find_element 메소드로 특정 HTML을 찾는다. 

 

print(search_bar.tag_name)

>>input

 

print(search_bar.get_attribute("src"))
print(search_bar.size)

>>https://www.python.org/static/img/python-logo@2x.png
{'height': 82, 'width': 290}

 

 

< 예시3 >

id, class가 없는 상황에서 css selector을 이용하는 경우

3) css selector로 가져오기

hyperlink = driver.find_element(By.CSS_SELECTOR, ".slide-copy p a" )
print(hyperlink.text)
driver.quit()

>>More about defining functions in Python 3

 

 

 

< 예시4 >

id, class, css selector도 사용할 수 없는 상황 >> XPath

XPath

Xpath는XML에서 특정 요소와 속성을 찾기 위해 쓰인다. 

경로 구조로 특정 HTML 요소의 위치를 찾는 방법은 아래와 같다. 

해당 HTML> 오른쪽 마우스 클릭> 복사> XPath 전체 복사

xpath = driver.find_element(By.XPATH, '/html/body/div/footer/div[1]/div/ul/li[1]/ul/li[2]/a')
print(xpath.text)

>>Quotes

 

 

 

 

셀레늄 공식 다큐먼트 document

https://selenium-python.readthedocs.io/navigating.html