도와주세요

[Selenium] 특정 XPath에서 parent 노드의 iframe을 알아낼 수 있을까요?

이니스프리2020.01.02 16:04조회 수 39댓글 2

    • 글자 크기

안녕하세요?


새해의 첫 근무일 잘 보내고 계시는지요? ^^



어제 휴일이어서 예전에 작성한 Selenium을 이용하여 특정 element를 스크린 캡쳐하는 스크립트를 수정해봤는데요.


iframe 내의 element의 경우에 직접 접근할 수 없으므로 iframe_on = 1으로 대입한 경우에 switch_to.frame을 하도록 하도록 하였구요.


iframe_on = 0으로 대입한 경우에는 바로 element에 접근하도록 했는데요.



이렇게 일일이 iframe의 존재 여부 및 XPath값을 대입하지 않고서도 


원하는 element의 XPath만 입력받아서 iframe 내부에 존재하는 element에 접근할 수 있는 방법을 생각해보고 있는데 쉽지 않네요 ㅠㅠ


제가 뭔가 웹에 대한 이해가 전반적으로 부족한 것 같기도 하구요~


Selenium에서는 XPath를 이용하여 바로 접근할 수 있지만, BeautifulSoup에서는 이런 방식이 허용되지 않는 문제와 겹쳐서 더욱 어려운 것 같네요.


특정 XPath에서 parent 노드의 iframe을 알아내서 그 XPath값을 얻어낸다면 해결될 수 있는 문제 같은데요.


1. //*[@id="post_688075132"] // parent :: iframe 이런 방식으로는 접근이 안 되는 것 같네요. 다른 접근 방법은 없을까요??


2. BeautifulSoup에서 Xpath를 지원한다면 조금 수월하게 해결될지도 모르겠는데 그렇다면 lxml이나 htmlement를 사용하면 해결 가능할까요??

(설치해서 시도는 해봤는데 아직까지는 잘 안 되네요 ㅠㅠ)



그럼 주말에 다시 날씨가 쌀쌀해진다는데 감기 조심하시구요.


스포어 회원님들께 항상 감사드립니다!


좋은 오후 되세요~ ^^



from selenium import webdriver
from selenium.webdriver.firefox.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from bs4 import BeautifulSoup
from PIL import Image
from io import BytesIO
import time

options = Options()
options.headless = True
driver = webdriver.Firefox(options=options)
driver.implicitly_wait(10)

url = 'https://cafe.naver.com/joonggonara/689072432' # iframe을 사용한 예제 페이지로 중고나라를 선택했습니다.
xpath_e = '//*[@id="post_689072432"]'
driver.get(url)
time.sleep(1)
WebDriverWait(driver, 5).until(EC.visibility_of_all_elements_located((By.TAG_NAME, 'body')))

# 전체 페이지의 사이즈를 구하여 브라우저의 창 크기를 확대하고 스크린캡처를 합니다.
#driver.execute_script("document.body.style.zoom='zoom 100%'")
page_width = driver.execute_script('return document.body.parentNode.scrollWidth')
time.sleep(1)
page_height = driver.execute_script('return document.body.parentNode.scrollHeight')
time.sleep(1)
driver.set_window_size(page_width, page_height)
time.sleep(1)
png = driver.get_screenshot_as_png()
time.sleep(1)

# 특정 element 및 해당 iframe의 위치를 구합니다.

iframe_on = 1 # 만약 iframe이 없으면 0을 대입합니다.
if iframe_on == 1:
    #WebDriverWait(driver, 5).until(EC.visibility_of_all_elements_located((By.XPATH, '//*[@id="cafe_main"]')))
    iframe = driver.find_element_by_xpath('//*[@id="cafe_main"]')
    iframe_location = iframe.location
    iframe_size = iframe.size
    driver.switch_to.frame(iframe)
    time.sleep(1)

element = driver.find_element_by_xpath(xpath_e)
image_location = element.location
image_size = element.size

# 이미지를 element의 위치에 맞춰서 crop 하고 저장합니다.
im = Image.open(BytesIO(png))

if iframe_on == 1:
    left = image_location['x'] + iframe_location['x']
    top = image_location['y'] + iframe_location['y']
    right = image_location['x'] + iframe_location['x'] + image_size['width']
    bottom = image_location['y']  + iframe_location['y'] + image_size['height']    
else:
    left = image_location['x']
    top = image_location['y']
    right = image_location['x'] + image_size['width']
    bottom = image_location['y'] + image_size['height']

im = im.crop((left, top, right, bottom))
rgb_im = im.convert('RGB')
filename = 'screenshot.jpg'
rgb_im.save(filename)
print('The element "' + xpath_e + '" was captured. : ' + filename)
driver.quit()



ཇོ་མོ་གླང་མ

    • 글자 크기
Beautifulsoup에서 .find(text=True, recursive=False)과 관련하여 질문 드립니다. (by 이니스프리) [파이썬] 윈도우에서 pip install로 모듈 설치시에 문제가 발생하는 것과 관련하여 질문 드립니다 (by 이니스프리)

댓글 달기

번호 제목 글쓴이 날짜 조회 수
공지 [중요] sfuh.tk 기본 제공 도메인 사용하는 분들 확인해주시기 바랍니다.5 마스터 2019.12.29 270
공지 회원 전용 페이지가 생겼습니다.16 마스터 2018.03.20 11965
공지 [필독] 질문하는 방법7 마스터 2018.02.23 1661
671 선택약정 안 되는 중고폰의 경우에는 어떤 단점이 있는 것인가요??6 이니스프리 2020.01.21 119
670 맥북 프로 구매와 관련하여 여쭤봅니다4 이니스프리 2020.01.20 60
669 커뮤니티 사이트의 출첵 게시판의 활성화에 대한 좋은 아이디어가 있을까요??4 이니스프리 2020.01.19 49
668 VPS에서의 Selenium 사용과 관련하여 질문 드립니다.1 이니스프리 2020.01.17 30
667 '링 피트 어드벤처'가 정말 운동이 되는가요??4 이니스프리 2020.01.11 48
666 우분투만 사용하다가 페도라 13 / Centos 6.9 시험에 응시하려면 적응하기 어려울까요? ㅠㅠ8 이니스프리 2020.01.08 64
665 파이썬 에디터로 어떤 것이 좋나요?14 맛스타 2020.01.08 109
664 이미지 외부링크가 엑박으로 나온다면 어느 부분을 우선적으로 검토해야 될까요? 이니스프리 2020.01.05 29
663 해상도는 다르지만 동일한 이미지인지 체크하는 방법이 있을까요?2 이니스프리 2020.01.05 28
662 Beautifulsoup에서 .find(text=True, recursive=False)과 관련하여 질문 드립니다.2 이니스프리 2020.01.03 30
[Selenium] 특정 XPath에서 parent 노드의 iframe을 알아낼 수 있을까요?2 이니스프리 2020.01.02 39
660 [파이썬] 윈도우에서 pip install로 모듈 설치시에 문제가 발생하는 것과 관련하여 질문 드립니다2 이니스프리 2019.12.29 37
659 여러 개의 반복작업을 켜고 끄는 버튼을 비동기적으로 구현해보려고 하는데요 ㅠㅠ2 이니스프리 2019.12.27 57
658 유튜브 채널 주소 잘아시는분있나요?2 슬기 2019.12.27 41
657 Requests나 Selenium에서 어떤 XHR 전송이 있었는지 확인할 수 있는 방법이 있을까요?3 이니스프리 2019.12.26 38
656 카고야 VPS에서 메일이 왔는데 일본어 관련해서 질문 드립니다.5 이니스프리 2019.12.26 61
655 [파이썬] 결과를 print 문으로 출력하는 것과 파일로 출력하는 것과 결과가 왜 다른가요?8 이니스프리 2019.12.25 39
654 음성번역기 앱 중에 켜놓으면 계속 번역을 해주는 앱이 있을까요? 이니스프리 2019.12.25 27
653 https://imgnbvip.com/ 라는 이미지 호스팅 사이트가 있나요? 이니스프리 2019.12.24 31
652 Google Developer Console의 API 라이브러리 무료 이용에 대해 질문 드립니다.5 이니스프리 2019.12.23 48
이전 1 2 3 4 5 6 7 8 9 10... 34다음
첨부 (0)
서버에 요청 중입니다. 잠시만 기다려 주십시오...