2017-02-05 60 views
0

我做了一個爬行器該頁面(http://www.bobaedream.co.kr/cyber/CyberCar.php?gubun=I)收集特定製造商的股票列表。我的代碼從選擇搜索菜單第一行的下拉菜單開始。如何使用Selenium Python保存特定頁面的驅動程序,直到保存特定的下拉菜單列表和整個列表請求?

enter image description here

每個右邊的下拉菜單是其左側的下拉菜單的子菜單。我想要做的是在每個下拉菜單中選擇每個第一項,然後單擊第一次運行的「搜索」按鈕。抓取其股票列表後,然後設置最後一個下拉菜單的第二項,然後單擊「搜索」按鈕。 (如果最後一個下拉菜單中只有一個項目,則從最後一個下拉菜單中選擇第二個項目,然後選擇第二個項目。)

但是問題出現在這裏。我將每個下拉菜單的每個項目保存爲元組。當我嘗試調用第二輪爬行的最後一個下拉菜單中的第二項時,出現「StaleElementReferenceException」或「NoSuchElementException」,並顯示消息「元素不再附加到DOM」。因此,我想讓驅動器一直到每個下拉菜單迭代完成。

下面是我的代碼,但仍然有錯誤消息。我的錯誤通常發生在第二個while循環中。此時,我添加了一些「等待」功能和「刷新」功能。有時它可以幫助我擺脫代碼中的while循環,但通常它會陷入while循環和無限重複。我猜想第二個「try」函數中的某種類型的「wait.until(EC。〜)」代碼可以解決這個問題,但我對此沒有具體的想法。請幫忙或給我任何建議。

def option2_menu_loaded(inDriver): 
    path = '//select[@id="level2_no"]' 
    return inDriver.find_element_by_xpath(path) 

self.wait.until(option2_menu_loaded) 

while True: 
    try: 
     select_option2_values = [ 
      ('%s' % o.get_attribute('text'), '%s' % o.get_attribute('value')) 
      for o 
      in Select(self.driver.find_element_by_css_selector("#level2_no")).options 
      if o.get_attribute('text') != '세부등급'] 
    except (StaleElementReferenceException, NoSuchElementException): 
     print("=======Exception Found - Option2 Save=====") 
     self.driver.refresh() 
     self.driver.implicitly_wait(1.5) 
     continue 
    break 

for option2 in select_option2_values: 
    self.csv.setCarTitle(ma, mo, de, option1[0], option2[0]) 

    print(option2[0], option2[1]) 
    self.driver.implicitly_wait(0.5) 

    while True: 
     try: 
      Select(self.driver.find_element_by_css_selector("#level2_no")).select_by_value(option2[1]) 

     except (StaleElementReferenceException, NoSuchElementException): 
      print("=======Exception Found - Option2 Request=====") 
      self.driver.refresh() 
      self.driver.implicitly_wait(1.5) 
      self.driver.refresh() 
      continue 
     break 

回答

0

這意味着尋找元素,並使用元素對象之間的袋重載,確保頁面每次你需要使用它的時候先加載和搜索的元素。

額外的檢查是在做選擇之前添加一個額外的等待元素,因爲find_element_by_css_selector根本不會等待元素可用。

的順序應該是:頁面加載>等到元素存在>使用動作元素

+0

感謝您的評論。那麼我需要應用什麼「等到元素存在」函數?你有什麼主意嗎? –

+0

在這裏查看一個列表,用python等待selenium https://selenium-python.readthedocs.io/waits.html – lauda

+0

這裏有一些例子的問題https://stackoverflow.com/questions/7781792/selenium-waitforelement – lauda

相關問題