2015-02-07 22 views
1

我從here爬行文本。我需要反覆點擊「Load More Arguments」來獲取頁面上列出的所有參數。這裏是我的代碼:如何使用硒重複獲取內容<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:是不是你想要的狀態。如果這種情況是有史以來是真實的,那麼你既不也不move_to_elementclick會的工作,因爲他們和你if not link:測試之間沒有什麼可以參照的元素改變linkNone(或其他一些假值)。元素引用,link包含可能成爲陳舊但這種問題的產生特定的異常。沒有什麼魔法可以使None失效。

很可能,您當前遇到的超時事件表示您已完成。我希望加載更多參數的按鈕在您加載所有內容時將不可用(因爲它不再存在或者因爲它被禁用)。如果異常的突破(我無法驗證這一點,因爲你提供的鏈接讓我到不說明問題的頁面。)

,你可以退出你的循環。這也需要在沒有參數還沒有的情況下照顧或有沒有足夠參數,以保證按鍵的存在:

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 2015-02-07 19:41:52