1. XPath์ CSS Selector๋?
์ค๋์ Selenium์ ํ์ฉํ ์น ์๋ํ์ ์ธ๊ณ๋ก ํ ๊ฑธ์ ๋ ๋์๊ฐ์ XPath์ CSS Selector๋ฅผ ๋ฐฐ์๋ณผ ๊ฑฐ์ผ. ์ด ์์ง๋ง ๊ฐ๋ ฅํ ๋๊ตฌ๋ค์ ์น ํ์ด์ง์์ ์์๋ฅผ ์ฐพ์ ๋ ์ ๋ง ์ ์ฉํ ์น๊ตฌ๋ค์ด ๋ ๊ฑฐ์ผ. ์ ๋ ํฐ์ ์ธ๊ณ๋ก ํจ๊ป ๋ค์ด๊ฐ์ ์ ํํ๊ณ ํจ์จ์ ์ธ ๊ฒ์์ ์ํ ์ฌ์ฉ๋ฒ์ ์์๋ณด์.
๋ง์ฝ HTML ๋ฌธ์๊ฐ ๋นฝ๋นฝํ ์ฒ์ด๋ผ๋ฉด, XPath์ CSS Selector๋ ๋์ ์ง๋๋ฅผ ๋์ ํ ๊ฑฐ์ผ. ์ด ๋๊ตฌ๋ค์ ํตํด ํ์ํ ๋๋ฌด(ํน์ ํ๋ก๊ทธ๋๋ฐ์์์ ์์)๋ฅผ ์ฐพ์๊ฐ ์ ์์ด. HTML ์ฝ๋์ ์๋ง์ ํ๊ทธ๋ค ์์์๋ ์์๋ฅผ ์ฐพ์ ์ ์๊ฒ ๋์์ค ๊ฑฐ์ผ.
XPath
XPath(XML Path Language)๋ XML ๋ฌธ์๋ฅผ ํ์ํ๊ธฐ ์ํ ์ธ์ด์ผ. ํ์ง๋ง ๋๊ฐ ๊ทธ๋ฌ๋๋ผ, HTML์ XML์ ํ์ด๋ธ๋ฆฌ๋๋ผ๊ณ ? ๊ทธ๋์ HTML ๋ฌธ์์๋ XPath๋ฅผ ์ ์ฉํ๊ธฐ ํธ๋ฆฌํ ๊ฑฐ์ผ. XPath๋ ๋ค๊ฐ ์ง์ ํ ๊ฒฝ๋ก๋ฅผ ๋ฐ๋ผ ์์์ ๋๋ฌํ ์ ์์ด.
CSS Selector
CSS Selector๋ Cascading Style Sheets์ ์ธ๊ณ์์ ์์ด. ๊ฑฑ์ ๋ง, ์ด๊ฑธ ๋ฐฐ์ด๋ค๊ณ ๋์์ด๋๊ฐ ๋ ํ์๋ ์์ด! ์ด๊ฑด ํ์ , ํด๋์ค, ์์ด๋, ์ํ ๋ฑ์ผ๋ก ์์๋ฅผ ์ ํํ ์ ํํ๊ธฐ ์ํ ๊ฑฐ์ผ. ์๊ฐ๋ณด๋ค ๊ฐ๋จํด, ์ด๋ฏธ ์น ํ์ด์ง ์คํ์ผ๋ง์ ํ ๋ ๋ฌด์์์ ์ผ๋ก ์ฌ์ฉํด๋ดค์ ์๋ ์์ด.
2. ์ฝ๋์์์ XPath์ CSS Selector ํ์ฉ
์ด์ ์ ๋ ํฐ๊ฐ ๋ฌด์์ธ์ง ์์์ผ๋ ๋ฐ๋ก ์ค์ต์ผ๋ก ๊ฐ๋ณด์. Selenium๊ณผ ํจ๊ป ์ด๊ฑธ ํ์ฉํด์ ์ด๋ป๊ฒ ๋ง๋ฒ์ ๋ถ๋ฆด ์ ์๋์ง ๋ฐฐ์๋ณด์!
XPath ์ฌ์ฉ
Selenium์์ XPath๋ฅผ ์ด์ฉํด ์์๋ฅผ ์ฐพ๋ ์์ ์ผ:
from selenium import webdriver
# ๋๋ผ์ด๋ฒ ์ค์
driver = webdriver.Chrome()
# ํ์ด์ง ์ด๊ธฐ
driver.get('https://example.com')
# XPath๋ก ์์ ์ฐพ๊ธฐ
element = driver.find_element_by_xpath('//div[@id="menu"]/ul/li/a')
# ์์์ ํ
์คํธ ์ถ๋ ฅ
print(element.text)
# ๋ธ๋ผ์ฐ์ ๋ซ๊ธฐ
driver.quit()
์ค๋ช :
-
//div[@id="menu"]/ul/li/a
โ ์ด๊ฒ ์ฐ๋ฆฌ์ XPath์ผ. ์ด ์๋ฏธ๋ ์ด๋ ๊ฒ ์ฝ์ ์ ์์ด: "๋๋ผ์ด๋ฒ์ผ,li
์์ ์๋ul
์์ ์๋div
์คid="menu"
์ธa
์์๋ฅผ ์ฐพ์์ค."
CSS Selector ์ฌ์ฉ
์ด์ CSS Selector๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ณด์:
from selenium import webdriver
# ๋๋ผ์ด๋ฒ ์ค์
driver = webdriver.Chrome()
# ํ์ด์ง ์ด๊ธฐ
driver.get('https://example.com')
# CSS Selector๋ก ์์ ์ฐพ๊ธฐ
element = driver.find_element_by_css_selector('div#menu > ul > li > a')
# ์์์ ํ
์คํธ ์ถ๋ ฅ
print(element.text)
# ๋ธ๋ผ์ฐ์ ๋ซ๊ธฐ
driver.quit()
์ค๋ช :
-
div#menu > ul > li > a
โ ์ฐ๋ฆฌ์ CSS Selector์ผ. XPath์ ๋น์ทํ๊ฒ ์์๋ฅผ ์ฐพ์ง๋ง ๋ ๊ฐ๊ฒฐํ ๋ฌธ๋ฒ์ ์ฌ์ฉํด.
3. XPath์ CSS Selector์ ์ฐจ์ด
XPath์ CSS Selector์ ์ฐจ์ด๊ฐ ๋ญ๋๊ณ ? ์ข์ ์ง๋ฌธ์ด์ผ! ์ธ์ ๋ฌด์์ ์จ์ผ ํ ์ง ํ ๋ฒ ์์๋ณด์.
์ ์ฐ์ฑ vs. ๊ฐ๋จํจ
XPath๋ ๋ ์ ์ฐํด. DOM ํธ๋ฆฌ์์ "์๋ก" ์ด๋ํ๊ฑฐ๋ ๋ณต์กํ ๋ ผ๋ฆฌ ์กฐ๊ฑด์ ์ฌ์ฉํ๋ ๋ฐ ์ ์ฉํด. ๊ทธ๋์ ๋ ๋ณต์กํ ์์ฒญ์ ์ฒ๋ฆฌํ๋ ๋ฐ ์ ๋ฆฌํ์ง. ํ์ง๋ง CSS Selector์ ๊ฐ๋จํจ๊ณผ ๊ฐ๊ฒฐํจ์ ๋ ์ ํธ๋ ์๋ ์์ด. CSS Selector๋ ์ฝ๊ณ ์ฐ๊ธฐ ์ฝ๊ณ , ํนํ ํด๋์ค๋ ์์ด๋๋ก ์์๋ฅผ ์ฐพ์์ผ ํ ๋ ์ ๋ฆฌํด.
ํจ์ ์ง์
XPath๋ ํจ์ ์ฌ์ฉ์ ์ง์ํด โ ํ
์คํธ ํ์ธ๋ถํฐ ์์ฑ ์์
๊น์ง,
contains()
๋ starts-with()
๊ฐ์ ๊ธฐ๋ฅ๋ค์ ์ฌ์ฉํ ์ ์์ด.
ํ์ง๋ง CSS Selector๋ ์ด๋ ๊ฒ ๋ณต์กํ ์ง์์ ์์ด.
์์ ์๋
๋ช๋ช ์๋๋ฆฌ์ค์์๋ CSS Selector๊ฐ ๋ ๋น ๋ฅด๊ฒ ์๋ํด. ์ด๋ ๋ธ๋ผ์ฐ์ ๊ฐ CSS Selector๋ก ์์ ํ๋๋ก ์ต์ ํ๋์ด ์์ด์ ๊ฐ๋จํ ์์ ์์๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ํ๋๊ธฐ ๋๋ฌธ์ด์ผ.
๋ฌธ๋ฒ
XPath๋ ๋ ๋ณต์กํ ๋ฌธ๋ฒ์ ๊ฐ์ง๊ณ ์์ด. ์ด๊ฑด ์ฅ์ ์ด์ ๋จ์ ์ด ๋ ์ ์์ด. CSS Selector๋ ์ฐ๊ธฐ ๋ฐฐ์ฐ๊ธฐ ๋ ์ฌ์.
4. ์ค์ ์ ์ฉ
์ด์ ๋ฐฐ์ด ์ง์์ ์ค์ ์์ ์ ์ ์ฉํด๋ณด์. ์๋ฅผ ๋ค์ด ์ํ ํ ์ด๋ธ์ด ์๋ ์น ํ์ด์ง์์ ๋ชจ๋ ์ํ ์ด๋ฆ๊ณผ ๊ฐ๊ฒฉ์ ์์งํด์ผ ํ๋ค๊ณ ํด๋ณด์. ์ด๋ฐ ์์ผ๋ก ํ ์ ์์ด:
XPath๋ฅผ ์ฌ์ฉํ ์์
from selenium import webdriver
# ๋๋ผ์ด๋ฒ ์ค์
driver = webdriver.Chrome()
# ํ์ด์ง ์ด๊ธฐ
driver.get('https://example.com/products')
# ๋ชจ๋ ์ํ ์์ ์ฐพ๊ธฐ
products = driver.find_elements_by_xpath('//table[@class="product-table"]/tbody/tr')
# ๊ฐ ์ํ์ ๋ฐ์ดํฐ ์ถ์ถ
for product in products:
name = product.find_element_by_xpath('.//td[@class="product-name"]').text
price = product.find_element_by_xpath('.//td[@class="product-price"]').text
print(f"Product: {name}, Price: {price}")
# ๋ธ๋ผ์ฐ์ ๋ซ๊ธฐ
driver.quit()
CSS Selector๋ฅผ ์ฌ์ฉํ ์์
from selenium import webdriver
# ๋๋ผ์ด๋ฒ ์ค์
driver = webdriver.Chrome()
# ํ์ด์ง ์ด๊ธฐ
driver.get('https://example.com/products')
# ๋ชจ๋ ์ํ ์์ ์ฐพ๊ธฐ
products = driver.find_elements_by_css_selector('table.product-table > tbody > tr')
# ๊ฐ ์ํ์ ๋ฐ์ดํฐ ์ถ์ถ
for product in products:
name = product.find_element_by_css_selector('td.product-name').text
price = product.find_element_by_css_selector('td.product-price').text
print(f"Product: {name}, Price: {price}")
# ๋ธ๋ผ์ฐ์ ๋ซ๊ธฐ
driver.quit()
5. ํน์ง๊ณผ ์ผ๋ฐ์ ์ธ ์ค์
XPath์ CSS Selector๋ฅผ ์ฌ์ฉํ ๋ ๋ช ๊ฐ์ง ํจ์ ์ด ์์ด. ์๋ฅผ ๋ค์ด, XPath์ ์ ๋ ๊ฒฝ๋ก๋ฅผ ์ฌ์ฉํ ๋ HTML ๊ตฌ์กฐ๊ฐ ์กฐ๊ธ๋ง ๋ฐ๋์ด๋ ์คํฌ๋ฆฝํธ๊ฐ ๊นจ์ง ์ํ์ด ์์ด. ๊ทธ๋์ ํญ์ ์๋ ๊ฒฝ๋ก๋ฅผ ์ฌ์ฉํด์ ์ ์ฐ์ฑ์ ์ ์งํ๋ ค๊ณ ๋ ธ๋ ฅํ์.
CSS Selector๋ ๋ฐ๋ฉด, ๋๋ฌด ๋ณต์กํด์ง๋ฉด ์ฝ๊ธฐ๊ฐ ์ด๋ ค์์ง ์ ์์ด. ์ ํ์ฑ๊ณผ ๊ฐ๋จํจ์ ๊ท ํ์ ์ ๋ง์ถ๋ ๊ฒ ์ค์ํด.
๋ ํ๋ ์ธ๊ธํด์ผ ํ ๊ฑด ์ค๋ฅ ์ฒ๋ฆฌ์ผ. ์์๋ฅผ ์ฐพ์ง ๋ชปํ๋ฉด Selenium์ NoSuchElementException
๋ฅผ ๋์ง ๊ฑฐ์ผ.
try-except
๋ธ๋ก์ด๋ WebDriverWait
๊ฐ์ ๋๊ธฐ ๋ฉ์๋๋ฅผ ์ฌ์ฉํด์ ์ด ๋ฌธ์ ๋ฅผ ์ฒ๋ฆฌํ๊ณ ์คํฌ๋ฆฝํธ๋ฅผ ๋์ฑ ์์ ์ ์ผ๋ก ๋ง๋ค์ด๋ณด์.
GO TO FULL VERSION