for문에서 창 전환 후 에러 해결 방법 문의
1457
코딩초보
작성한 질문수 6
0
from selenium import webdriver # webdriver 불러오기
from selenium.webdriver.chrome.options import Options # 브라우저 닫힘 방지
from selenium.webdriver.chrome.service import Service # 크롬드라이버 다운로드(새로운 버전 다시 받을 필요 없음)
from webdriver_manager.chrome import ChromeDriverManager # 크롬드라이버 다운로드(새로운 버전 다시 받을 필요 없음)
import time
import pyautogui
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
options = Options()
options.add_experimental_option('detach', True) # 브라우저 바로 닫힘 방지
options.add_experimental_option('excludeSwitches', ['enable-logging']) # 불필요한 메시지 제거
service = Service(ChromeDriverManager().install())
#service = Service(ChromeDriverManager().install()) 이 부분을
# ChromeDriverManager(path="원하는 경로") 이렇게 사용하면 원하는 곳에
# 크롬드라이버를 다운로드하게 됩니다.
driver = webdriver.Chrome(service=service, options=options)
driver.get("https://www.g2b.go.kr:8101/ep/tbid/tbidFwd.do")
time.sleep(2)
search_click = driver.find_element("#bidNm").click()
keyword = pyautogui.prompt("<<<검색어를 입력하세요 >>>")
search_keyword = driver.find_element(By.CSS_SELECTOR,"#bidNm").send_keys(keyword)
output_num = driver.find_element(By.CSS_SELECTOR,"#recordCountPerPage").click()
output_num_select = driver.find_element(By.CSS_SELECTOR,"#recordCountPerPage > option:nth-child(5)").click()
search_btm_click = driver.find_element(By.CSS_SELECTOR,"#buttonwrap > div > a:nth-child(1)").click()
bid_infors = driver.find_elements(By.CSS_SELECTOR,"tbody tr")
for bid in bid_infors :
title = bid.find_element(By.CSS_SELECTOR,"td:nth-child(4) > div > a").text
link = bid.find_element(By.CSS_SELECTOR,"td:nth-child(4) > div > a").get_attribute('href')
client = bid.find_element(By.CSS_SELECTOR,"td:nth-child(5) > div").text
print("공고명 : ", title)
print("주소 : ", link)
print("발주처 : ",client )
print()
# 사전규격 크롤링
driver.get("https://www.g2b.go.kr:8081/ep/preparation/prestd/preStdSrch.do")
time.sleep(2)
keyword2 = pyautogui.prompt("<<<검색어를 입력하세요 >>>")
search_keyword2 = driver.find_element(By.CSS_SELECTOR,"#prodNm").send_keys(keyword2)
output_num2 = driver.find_element(By.CSS_SELECTOR,"#recordCountPerPage").click()
output_num2_select2 = driver.find_element(By.CSS_SELECTOR,"#recordCountPerPage > option:nth-child(5)").click()
search_btm_click2 = driver.find_element(By.CSS_SELECTOR,"#frmSearch1 > div.button_wrap > div > a:nth-child(1)").click()
bid_infors2 = driver.find_elements(By.CSS_SELECTOR,"tbody tr")
for bid2 in bid_infors2:
title2 = bid2.find_element(By.CSS_SELECTOR, "td:nth-child(4) > div > a").text
client2 = bid2.find_element(By.CSS_SELECTOR, "td:nth-child(5) > div").text
link_click = bid2.find_element(By.CSS_SELECTOR, "td:nth-child(4) > div > a").click()
time.sleep(2)
link2 = driver.current_url
print("공고명 : ", title2)
print("주소 : ", link2)
print("발주처 : ",client2)
print()
driver.back()
time.sleep(2)
위 코드에서 발생하는 코드는 아래와 같습니다.
Traceback (most recent call last):
File "c:\coding\나라장터크롤링\1.입찰공고크롤링.py", line 61, in <module>
title2 = bid2.find_element(By.CSS_SELECTOR, "td:nth-child(4) > div > a").text
File "C:\Users\landj\AppData\Local\Programs\Python\Python310\lib\site-packages\selenium\webdriver\remote\webelement.py", line 425, in find_element
return self._execute(Command.FIND_CHILD_ELEMENT, {"using": by, "value": value})["value"]
File "C:\Users\landj\AppData\Local\Programs\Python\Python310\lib\site-packages\selenium\webdriver\remote\webelement.py", line 403, in _execute
return self._parent.execute(command, params)
File "C:\Users\landj\AppData\Local\Programs\Python\Python310\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 440, in execute
self.error_handler.check_response(response)
File "C:\Users\landj\AppData\Local\Programs\Python\Python310\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 245, in check_response
raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.StaleElementReferenceException: Message: stale element reference: element is not attached to the page document이것 저것 다해봐도 안되네요...해결 방법을 알려주시면 감사하겠습니다.
답변 1
0
bid_infors2 = driver.find_elements(By.CSS_SELECTOR,"tbody tr")driver.back()을 할 경우 기존에 가지고 있던 태그객체 정보를 잃어 버립니다.
(원래 페이지에 있는 태그가 뭐였지?라고 오류가 뜨는 경우였어요)
리스트 목록을 다시 찾는 방식으로 구현해 봤습니다.
bid_infors2 = driver.find_elements(By.CSS_SELECTOR,"tbody tr")
i = 0
while i < len(bid_infors2):
title2 = bid_infors2[i].find_element(By.CSS_SELECTOR, "td:nth-child(4) > div > a").text
client2 = bid_infors2[i].find_element(By.CSS_SELECTOR, "td:nth-child(5) > div").text
link_click = bid_infors2[i].find_element(By.CSS_SELECTOR, "td:nth-child(4) > div > a").click()
time.sleep(2)
link2 = driver.current_url
print("공고명 : ", title2)
print("주소 : ", link2)
print("발주처 : ",client2)
print()
driver.back()
time.sleep(2)
bid_infors2 = driver.find_elements(By.CSS_SELECTOR,"tbody tr")
i += 1time.sleep은 네트워크 환경에 맞게 조금 줄여도 괜찮을 듯 합니다.
셀레니움 환경설정 오류
0
48
2
네이버 로그인 관련
0
261
2
안녕하세요 셀레니움에 대해서 질문
0
85
1
크롤링 연습사이트 문의
0
97
2
선택자 질문
0
71
2
'특정 요소가 나타날 때까지 스크롤' 부분 에러
0
78
2
자동 로그인 질문
0
89
2
44강 제목, 링크
0
105
1
원하는 값이 없을 때
0
90
2
크롤링한 링크가 엑셀로 들어가면 작동이 안되요
0
227
2
셀레니움 PDF자료는 받을 수 있나요
0
100
2
글목록 추출하기
0
98
2
메일 자동화 로그인 중복방지문자해결 오류 및 명시적 대기 질문
0
88
2
강의 노트가 어디에 있는건가요?
0
80
2
강의 커리큘럼 질문
0
98
1
조건문 else 사용하지 않는 이유
0
76
2
셀레니움으로 접근할 수 없는 경우
0
95
2
웹페이지 변경
0
72
2
자바스크립트로 태그 선택 시 질문입니다.
1
64
2
수료증은 어떻게 받나요?
0
120
2
class명을 활용하여 선택자를 만들지 않는 경우..?
0
61
2
드라이버가 안 열려요
0
79
2
이거 해결방법 아시는 분?
0
121
2
네이버 지식인 크롤링..
0
202
2





