bugfix> python > 投稿

こんにちは、私はWebスクレイピングを初めて使い、Seleniumを使用してスクレイピングしようとしています。フォーラム Pythonで

私は、Seleniumに最後のページまで「次へ」をクリックさせようとしていますが、どのようにループを解除するのかわかりません。ロケーターに問題があります:

次のボタンを見つけたとき部分リンク、自動クリックは次のスレッドに続きます(例:page1->page2->次のスレッド->次のスレッドのページ1->次のスレッドのページ2

while True:
    next_link = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.PARTIAL_LINK_TEXT, "Next")))
    next_link.click()

次のボタンを見つけたときクラス名、自動クリックは最後のページに到達したときに「戻る」ボタンをクリックします

while True:
    next_link = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.CLASS_NAME, "prevnext")))
    next_link.click()

私の質問は:

  1. どのロケーターを使用する必要がありますか? (クラス別、部分リンク別、または任意 他の提案?
  2. ループを解除して、到達したときにクリックを停止するにはどうすればよいですか 最後のページ?
回答 3 件
  • 次のコードを使用して、最後のページに到達するまで[次へ]ボタンをクリックし、ボタンが存在しない場合はループを解除できます。

    from selenium.common.exceptions import TimeoutException
    while True:
        try:
            WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.LINK_TEXT, "Next ›"))).click()
        except TimeoutException:
            break
    
    

  • 一意の識別を提供する任意のロケーターを使用できます。ベストプラクティスでは、次の順序になっています。

    Id

    名前

    クラス名

    Cssセレクター

    Xpath

    その他

    要素が見つからないときにwhileループから抜け出すには、以下のようにtryブロックを使用できます。同じためにbreakコマンドが使用されます。

    while True:
        try:
            next_link = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.CLASS_NAME, "prevnext")))
            next_link.click()
        except TimeoutException:
            break
    
    

  • 次のことを考慮する必要があることがいくつかあります。

    ページには2つの要素があり、テキストは 上の そして別の、どの要素とやり取りして独自のロケーター戦略を構築するかを決定する必要があります

    click() を呼び出したいときに進む  要素の代わりに予想条件 として presence_of_element_located()  あなたは element_to_be_clickable() を使用する必要があります 。

    次のようなテキストを持つ要素がない場合 残りのステップを実行する必要があるので、 click() を呼び出します  以内に try-catch  ブロックし、例外 break の場合  でる。

    あなたの要件に従ってxpath としてロケーター戦略 は、私にはよく見えますよ。

    作業コードブロックは次のとおりです。

    from selenium import webdriver
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    options = webdriver.ChromeOptions() 
    options.add_argument("start-maximized")
    options.add_argument('disable-infobars')
    driver=webdriver.Chrome(chrome_options=options, executable_path=r'C:\Utility\BrowserDrivers\chromedriver.exe')
    driver.get("https://forums.hardwarezone.com.sg/money-mind-210/hdb-fully-paid-up-5744914.html")
    driver.find_element_by_xpath("//a[@id='poststop' and @name='poststop']//following::table[1]//li[@class='prevnext']/a").click()
    while True:
        try :
            WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, "//a[@id='poststop' and @name='poststop']//following::table[1]//li[@class='prevnext']/a[contains(.,'Next')]"))).click()
        except :
            print("No more pages left")
            break
    driver.quit()
    
    

    コンソール出力:

    No more pages left
    
    

あなたの答え