반응형
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;")
산출량
대신 를 사용합니다.
유도()하고 () 및 후속 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()
모두의 노력에 감사드립니다
반응형
'개발하자' 카테고리의 다른 글
FastAPI에서 테스트 간에 데이터베이스를 설정하고 해체하는 방법은 무엇입니까? (0) | 2023.07.19 |
---|---|
Python을 설치하려면 ipykernel을 설치해야 함 (0) | 2023.07.19 |
Python에서 디렉터리 권한을 테스트하시겠습니까? (0) | 2023.07.17 |
Python 3에서 edf 데이터를 읽는 방법 (0) | 2023.07.17 |
VS 코드 주피터: 파이썬 대화형 창을 기본 콘솔로 작동시킬 수 있는 방법이 있나요? (0) | 2023.07.16 |