2015-02-07 2 views
1

here에서 텍스트를 크롤링하고 있습니다. 반복적으로 "Load More Arguments"를 클릭하여 페이지에 나열된 모든 인수를 가져와야합니다. 여기Selenium을 반복 사용하여 콘텐츠를 얻는 방법 <Python>?

try: 
    while True: 
     link = WebDriverWait(driver, 5).until(
     EC.element_to_be_clickable((By.LINK_TEXT, "Load More Arguments"))) 

     ActionChains(driver).move_to_element(link).perform() 
     link.click() 
     time.sleep(3) #wait for the update to occurr so the page loads"new arguments for you" 
     print(driver.execute_script("return document.documentElement.outerHTML;")) 

     if not (link): 
      break 
finally: 
    None 

오류입니다 : 여기 내 코드는

File "debate.py", line 42, in <module> 
    EC.element_to_be_clickable((By.LINK_TEXT, "Load More Arguments"))) 
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/selenium-2.44.0-py2.7.egg/selenium/webdriver/support/wait.py", line 71, in until 
    raise TimeoutException(message) 
selenium.common.exceptions.TimeoutException: Message: 

내가 페이지에 나열된 인수를 취득 할 수 있지만, 나는 내 코드는 특히 루프에서, 조금 이상하다 생각합니다. "클릭 할 수 없음"과 같은 "그렇지 않다면"을 대체 할 항목이 필요하다고 생각합니다. 나에게 제안을 좀 해줄 수 있니?

감사합니다.

답변

2

예, if not link:은 원하는 조건이 아닙니다. 이 조건이 사실이라면 도 click도 작동하지 않습니다. linkNone (또는 다른 잘못된 값)으로 변경할 수있는 테스트와 if not link: 테스트 사이에 아무 것도 없기 때문에 작동하지 않습니다. link에 포함 된 요소 참조는 고발 일 수 있지만 이러한 종류의 문제는 특정 예외를 생성합니다. 낡은 참조를 None으로 바꾸는 마법은 없습니다.

모든 상황에서 현재 실행중인 timeout 이벤트는 완료되었음을 나타냅니다. 단추를 더 많은 인수를로드 할 수 unclickable (때문에 더 이상 존재하지 않거나 사용할 수 없기 때문에) 모든 것을로드 한 기대하고있다. (당신이 제공 한 링크가 문제를 설명하지 못하는 페이지로 이동하게되므로 이것을 확인할 수 없습니다.)

예외가 발생하면 루프를 종료 할 수 있습니다. 이것은 또한 아직 인수가없는 경우를 돌봐 또는 버튼의 존재 보증하는 충분한 인수가 없습니다 :

from selenium.common.exceptions import TimeoutException 

[....] 

while True: 
    try: 
     link = WebDriverWait(driver, 5).until(
      EC.element_to_be_clickable((By.LINK_TEXT, "Load More Arguments"))) 
    except TimeoutException: 
     break 
    [...] 

몇 가지 참고 사항 :

  1. 외부 try... finally은 블록은 아무 것도하지 않는 것 같습니다.

  2. 일반적으로 link.click()ActionChains없이 작동해야 하나의 작업에서 링크를 클릭하고 이동할 수 있습니다. 클릭하기 전에 이동을해야하는 아주 드문 경우가 있습니다.

  3. 당신은 time.sleep 호출을 인자의로드가 끝났을 때를 결정하기 위해 페이지의 상태를 검사하는 명백한 대기 시간으로 대체해야합니다.

+0

설명해 주셔서 감사합니다. 정말 도움이됩니다. :) – theteddyboy

관련 문제