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

するTry driver.find_element_by_css_selector(「[クラスで

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

を交換しよう'ui-paging-next']」)をクリックします。クリックしてください()またはFind_element_by_link_text( '次へ')をクリックしてください。 – Grasshopper

+0

Thanks Grあなたに答えてください。それはCSSセレクタでトリックをしなかったが、それはリンクテキストで動作しているようだ。テスト後にあなたに戻ってきます。ありがとう。 – SIM

+0

リンクをクリックしますが、別のエラーがスローされます。 "例外的な参照:要素がページ文書に添付されていません" – SIM

答えて

1

@Grasshopperは既に解決策を提供してきましたが、私はよコードが失敗する理由を理解するための詳細を教えてください

ページソースに同じHTMLというコードが2つあります。最初は隠されています(必要なもの)はありません。

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

理由です:CSSセレクタやXPathはリンクするだけで最初に出現、検索をあなたに返しながら

テキスト・リターンのみ表示テキストとリンク

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

でそれを確認することができますfind_element_by_css_selector(...)コードは機能しませんが、find_element_by_link_text(...)はありません。

また

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

はすでにあなたに必要な要素を返す必要がありますので、ちょうどあなたがすべきStaleElementReferenceException避けるために

tab_data = 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をとして再定義してください最初のページで定義されたは、次のページではアクセスできません。ちょうどあなたのコードでwhileループ

UPDATE

tab_data定義を置くこと* =

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行目と "list_rowsのデータの直前"のスクリプトでエラーが発生しています。 FYI、スクリプトを実行する前に、私はループの中でそのtab_dataを取った。私はしばらくの間に私の整流されたコードとのリンクを与えています。ありがとうございます。 – SIM

+0

これは今のところ試しているスクリプトです: "https://www.dropbox.com/s/kw71wircwbj5zv8/Rectified%20One.txt?dl=0" – SIM

+0

更新されたコードを確認してください – Andersson

関連する問題