2017-07-30 85 views
0

我用Python編寫一些代碼與硒組合。我打算從網頁解析表格。我有它的工作。但是,當我嘗試點擊下一頁按鈕時出現問題。刮板只從第一頁,而不是點擊下一步按鈕它退出而不引發任何錯誤解析表。所以,我不明白我錯過了什麼。麻煩點擊按鈕,下一個

這是給你考慮全碼:

from selenium import webdriver 
from selenium.webdriver.common.by import By 
from selenium.webdriver.support.wait import WebDriverWait 
from selenium.webdriver.support import expected_conditions as EC 

driver = webdriver.Chrome() 
wait = WebDriverWait(driver, 10) 

driver.get("https://toolkit.financialexpress.net/santanderam") 

wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, 'table.fe-datatable'))) 

tab_data = driver.find_element_by_css_selector('table.fe-datatable') 

while True: 
    wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, 'tr'))) 
    list_rows = [[cell.text for cell in row.find_elements_by_css_selector('td')] 
       for row in tab_data.find_elements_by_css_selector('tr')] 
    for data in list_rows: 
     print(data) 

    try: 
     driver.find_element_by_css_selector('a.ui-paging-next').click() 
    except: 
     break 

driver.quit() 

元素中的下一個頁面按鈕存在:

<div class="pagination ui-widget"><span class="ui-paging-current ui-state-default ui-state-disabled ui-corner-all ui-paging-prev">Prev</span><span class="ui-paging-current ui-state-default ui-state-disabled ui-state-highlight ui-corner-all">1</span><a class="ui-paging-button ui-state-default ui-corner-all" href="#">2</a><a class="ui-paging-button ui-state-default ui-corner-all" href="#">3</a><a class="ui-paging-button ui-state-default ui-corner-all" href="#">4</a><span class="ui-state-default ui-corner-all ui-state-disabled ui-paging-ellipse">...</span><a class="ui-paging-button ui-state-default ui-corner-all ep" href="#">7</a><a class="ui-paging-button ui-state-default ui-corner-all ui-paging-next" href="#">Next</a></div> 
+1

嘗試driver.find_element_by_css_selector(「一[類* = 'UI-尋呼下一']「)。單擊()或find_element_by_link_text( '下一步')。單擊() – Grasshopper

+0

的Gr感謝螞蚱,爲你答案。它沒有使用CSS選擇器的技巧,但它似乎與鏈接文本。測試後會回覆你。謝謝。 – SIM

+0

它確實點擊鏈接,但會引發另一個錯誤。 「raise exception_class(message,screen,stacktrace) selenium.common.exceptions.StaleElementReferenceException:消息:陳舊的元素引用:元素沒有附加到頁面文檔中」 – SIM

回答

1

@Grasshopper已經提供了一個解決方案,但我會盡量讓更多的細節讓你明白,爲什麼你的代碼沒有

存在與出現在網頁的源文件相同的HTML碼兩個環節:第一是隱藏的,第二(你需要的那個)不是。

您可以

print(len(driver.find_elements_by_css_selector('a.ui-paging-next'))) 

檢查它雖然CSS選擇器或XPath通過鏈接簡單的返回你的第一次出現,搜索文本返回只可見文本鏈接:

print(len(driver.find_elements_by_link_text('Next'))) 

這就是爲什麼您find_element_by_css_selector(...)代碼不起作用,但find_element_by_link_text(...)一樣。

還要注意的是線

wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, 'table.fe-datatable'))) 

應該已返回你所需的元素,所以在

tab_data = driver.find_element_by_css_selector('table.fe-datatable') 

無需只需使用

tab_data = wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, 'table.fe-datatable'))) 

要避免遇到StaleElementReferenceException你應該每個iterarion爲重新定義你的tab_data在第一頁上定義的將不能在下一頁上訪問。只要把while循環內tab_data定義

UPDATE

在您的代碼嘗試更換

try: 
    driver.find_element_by_link_text('Next').click() 
except: 
    break 

first_row = driver.find_element_by_css_selector('table.fe-datatable tr.odd').text 
try: 
    driver.find_element_by_link_text('Next').click() 
except: 
    break 
wait.until(lambda driver: driver.find_element_by_css_selector('table.fe-datatable tr.odd').text != first_row) 
+0

我在第192行和我的腳本剛剛「for list_rows中的數據:」之前得到了該錯誤。僅供參考,在執行腳本之前,我在內部循環中使用了tab_data。我在一段時間內給出了我的糾正代碼鏈接。謝謝先生。 – SIM

+0

這是腳本'現在嘗試:「https://www.dropbox.com/s/kw71wircwbj5zv8/Rectified%20One.txt?dl=0」 – SIM

+0

檢查更新的代碼 – Andersson