본문 바로가기

개발하자

Python 및 Selenium 웹 드라이버를 사용하여 style="display: none;"로 요소를 스크랩합니다

반응형

Python 및 Selenium 웹 드라이버를 사용하여 style="display: none;"로 요소를 스크랩합니다

나는 우리나라의 병원에서 진료 예약을 위한 웹 사이트를 스크랩하고 싶다. 이를 위해 나는 다음 코드를 사용한다:

from selenium import webdriver

d = webdriver.Chrome()
d.get("http://www.mojtermin.mk/map/spetsijalist?specialty=meditsinska_genetika&location=grad_skopje&clinic=jzu_uk_za_ginekologija_i_akusherstvo&resource=873745910")
d.maximize_window()
d.implicitly_wait(20)
d.find_element_by_id('cdk-describedby-message-0').text
termins = d.find_element_by_id(id_='cdk-describedby-message-0').text

print(termins)

코드를 실행하면 크롬이 성공적으로 열리고 웹사이트를 보여주지만 find_element_by_id는 빈 문자열만 반환하지 않았습니다.

내가 이 요소에 대해 크롬의 요소를 검사했을 때 나는 다음을 발견했다:

<div id="cdk-describedby-message-container" aria-hidden="true" style="display: none;"><div id="cdk-describedby-message-0">Нема слободни термини во наредните 3 месеци.</div></div>

find_element_by_id 반환 값을 요소에서 예상합니다. 이 경우:

"Нема слободни термини во наредните 3 месеци"

나는 여러 가지 방법을 시도했지만 매번 빈 문자열이 생기거나 요소를 찾을 수 없었다.

참고: 가치를 위해 번역: "향후 3개월 동안 무료 일정이 없습니다."




속성이 로 설정된 부모 요소 내에 텍스트가 있는 요소입니다.

따라서 요소가 웹 페이지에 표시되지 않기 때문에 일반적인 방식으로 웹 페이지와 상호 작용할 수 없습니다.

그러나 다음과 같이 텍스트를 추출할 수 있는 몇 가지 방법이 있습니다:

  • 사용:

    print(WebDriverWait(driver, 20).until(EC.presence_of_element_located((By.CSS_SELECTOR, "div#cdk-describedby-message-0"))).get_attribute("innerHTML"))
    
  • 사용:

    print(WebDriverWait(driver, 20).until(EC.presence_of_element_located((By.XPATH, "//div[@id='cdk-describedby-message-0']"))).get_attribute("innerHTML"))
    
  • 및 사용:

    print(driver.execute_script("return document.getElementById('cdk-describedby-message-0').textContent;"))
    
  • 콘솔 출력:

    Нема слободни термини во наредните 3 месеци.
    
  • : 다음 가져오기를 추가해야 합니다:

    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    



당신이 찾고 있는 것처럼 다른 사람과 스타일 속성이 겹칩니다. 당신은 텍스트를 얻으려면 자바 스크립트를 사용해야 합니다. 아래 사용:

termins = d.execute_script("return   document.getElementById(\"cdk-describedby-message-0\").innerHTML;")

산출량

enter image description here




대신 를 사용합니다.

유도()하고 () 및 후속 CSS 선택기를 기다립니다.

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

d=webdriver.Chrome()
d.get("http://www.mojtermin.mk/map/spetsijalist?specialty=meditsinska_genetika&location=grad_skopje&clinic=jzu_uk_za_ginekologija_i_akusherstvo&resource=873745910")
d.maximize_window()
print(WebDriverWait(d,20).until(EC.presence_of_element_located((By.CSS_SELECTOR,"#cdk-describedby-message-container>#cdk-describedby-message-0"))).get_attribute("textContent"))

출력:

Нема слободни термини во наредните 3 месеци.



안녕하세요. 저는 @KunduK의 솔루션을 매우 유용하게 찾았고, 그 솔루션을 계속 테스트했습니다. 여기 제 최종 솔루션이 있습니다. 그리고 저는 그것이 자유로운 일정일 때 메일 알림을 보내는 기능을 추가합니다.

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import yagmail
import datetime
import time

local_time = time.ctime()

def send_mail():
    receiver = "somemail@hotmail.com"
    body = slot
    yag = yagmail.SMTP(user="somemail28@gmail.com", password="")
    yag.send(
    to=receiver,
    subject="Мој термин",
    contents=body
)

d=webdriver.Chrome()
d.get("http://www.mojtermin.mk/map/spetsijalist?specialty=interna_meditsina&location=grad_skopje&clinic=pzu_dr_aleksandar_manolev_skopje&resource=1221739979")
#d.maximize_window()
slot = (WebDriverWait(d,20).until(EC.presence_of_element_located((By.CSS_SELECTOR,"#cdk-describedby-message-container>#cdk-describedby-message-0"))).get_attribute("textContent"))
if slot == "Нема слободни термини во наредните 3 месеци.":
    print("Нема слободни термини во наредните 3 месеци.")
    print(local_time," - Nema slobodni termini", file=open("output.txt", "a"))
else:
    print(slot)
    send_mail()

d.quit()

모두의 노력에 감사드립니다


반응형