我做了一個爬行器該頁面(http://www.bobaedream.co.kr/cyber/CyberCar.php?gubun=I)收集特定製造商的股票列表。我的代碼從選擇搜索菜單第一行的下拉菜單開始。如何使用Selenium Python保存特定頁面的驅動程序,直到保存特定的下拉菜單列表和整個列表請求?
每個右邊的下拉菜單是其左側的下拉菜單的子菜單。我想要做的是在每個下拉菜單中選擇每個第一項,然後單擊第一次運行的「搜索」按鈕。抓取其股票列表後,然後設置最後一個下拉菜單的第二項,然後單擊「搜索」按鈕。 (如果最後一個下拉菜單中只有一個項目,則從最後一個下拉菜單中選擇第二個項目,然後選擇第二個項目。)
但是問題出現在這裏。我將每個下拉菜單的每個項目保存爲元組。當我嘗試調用第二輪爬行的最後一個下拉菜單中的第二項時,出現「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
感謝您的評論。那麼我需要應用什麼「等到元素存在」函數?你有什麼主意嗎? –
在這裏查看一個列表,用python等待selenium https://selenium-python.readthedocs.io/waits.html – lauda
這裏有一些例子的問題https://stackoverflow.com/questions/7781792/selenium-waitforelement – lauda