XPATH 이용하기
이해하기 쉽고, 장황하지 않은 자료를 기반으로 강의를 진행합니다.
PhantomJS 지원 종료 안내
PhantomJS는 현재 개발이 중단되었습니다. Headless Chrome/Firefox와 Selenium WebDriver(ChromeDriver/GeckoDriver) 또는 Playwright 등 최신 대안을 사용하세요.
10. XPATH를 이용하여 크롤링하기¶
- 마크업에서 요소를 정의하기 위해 path 경로를 사용하는 방법
- find_element(By.XPATH, ...), find_elements(By.XPATH, ...) 메서드로 검색 가능
- XPATH 문법 상세 참고
- / : 절대경로를 나타냄
- // : 문서내에서 검색
- //@href : href 속성이 있는 모든 태그 선택
- //a[@href='http://google.com'] : a 태그의 href 속성에 http://google.com 속성값을 가진 모든 태그 선택
- (//a)[3] : 문서의 세 번째 링크 선택
- (//table)[last()] : 문서의 마지막 테이블 선택
- (//a)[position() < 3] : 문서의 처음 두 링크 선택
- //table/tr/* 모든 테이블에서 모든 자식 tr 태그 선택
- //div[@*] 속성이 하나라도 있는 div 태그 선택
In [9]:
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
options = Options()
options.add_argument("--headless=new")
options.add_argument("--no-sandbox")
options.add_argument("--disable-dev-shm-usage")
driver = webdriver.Chrome(options=options)
driver.get('http://v.media.daum.net/v/20170922175202762')
title = driver.find_element(By.XPATH, "//title") # 문서내의 어떤 태그든지 가능
# head 태그 안에 있는 title 정보는 get_attribute('text') 메서드로 추출할 수 있습니다.
print(title.get_attribute('text'))
print(title.get_attribute('innerHTML'))
print(title.get_attribute('textContent'))
driver.quit()
In [62]:
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
options = Options()
options.add_argument("--headless=new")
options.add_argument("--no-sandbox")
options.add_argument("--disable-dev-shm-usage")
driver = webdriver.Chrome(options=options)
driver.get('http://v.media.daum.net/v/20170922182449443')
title = driver.find_element(By.XPATH, "/html/head/title") # 절대경로
# head 태그 안에 있는 title 정보는 get_attribute('text') 메서드로 추출할 수 있습니다.
print(title.get_attribute('text'))
print(title.get_attribute('innerHTML'))
print(title.get_attribute('textContent'))
driver.quit()
In [70]:
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
options = Options()
options.add_argument("--headless=new")
options.add_argument("--no-sandbox")
options.add_argument("--disable-dev-shm-usage")
driver = webdriver.Chrome(options=options)
driver.get('http://v.media.daum.net/v/20170202185812986')
title = driver.find_element(By.XPATH, "/html//title") # html 태그 내에서 다시 검색
# head 태그 안에 있는 title 정보는 get_attribute('text') 메서드로 추출할 수 있습니다.
print(title.get_attribute('text'))
print(title.get_attribute('innerHTML'))
print(title.get_attribute('textContent'))
driver.quit()
- 속성으로 검색하는 XPATH 문법: 태그[@속성=속성값]
In [71]:
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
options = Options()
options.add_argument("--headless=new")
options.add_argument("--no-sandbox")
options.add_argument("--disable-dev-shm-usage")
driver = webdriver.Chrome(options=options)
driver.get('http://v.media.daum.net/v/20170202185812986')
#soup.find('h3', attrs = {'class' : 'tit_s'})
title_content = driver.find_element(By.XPATH, "//h3[@class='tit_view']")
print(title_content.text)
# body 안에 있는 태그 요소는 .text 로 추출할 수 있습니다.
print(driver.find_element(By.XPATH, "//div[@id='harmonyContainer']").text)
driver.quit()
In [ ]:
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
options = Options()
options.add_argument("--headless=new")
options.add_argument("--no-sandbox")
options.add_argument("--disable-dev-shm-usage")
driver = webdriver.Chrome(options=options)
driver.get('http://v.media.daum.net/v/20170202180355822')
body = driver.find_element(By.XPATH, "//div[@id='harmonyContainer']")
for p in body.find_elements(By.TAG_NAME, 'p'):
print(p.text)
driver.quit()
연습문제
http://v.media.daum.net/v/20170202180355822 페이지에서
[김익현의 미디어 읽기] '마이너리티 리포트'와 AI
를 XPATH로 크롤링해서 출력하세요