こんにちは、私は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()
私の質問は:
- どのロケーターを使用する必要がありますか? (クラス別、部分リンク別、または任意 他の提案?
- ループを解除して、到達したときにクリックを停止するにはどうすればよいですか 最後のページ?
一意の識別を提供する任意のロケーターを使用できます。ベストプラクティスでは、次の順序になっています。
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
関連記事
- reactjsで「アラートボックスのOKボタンをクリックしてdivを非表示にする」方法
- ボタンをクリックしたときにファイルから読み取られるTextBlockにテキストを割り当てる方法
- セレンを使用してボタンが有効になっているかどうかを知る方法は?
- IDなしでブートストラップボタンをクリックした場合でも、どのようにトリガーできますか?
- メールをクリックするSelenium
- SleniumがDiscoverWebサイトログインの[ログイン]ボタンをクリックしない
- コピーボタンをクリックすると、JavaScript IDはデータベースから最初のデータをコピーするだけで、他のデータをコピーできません
- Java Seleniumでのマウスの移動後に要素をクリックする
- SeleniumでJavaScriptボタンを押す:Java
- ウェブスクレイピングクリックボタンセレン
- PythonでSeleniumを使用してYouTubeタグを取得するにはどうすればよいですか?
- 有効なXpathですが、空のdivが返されました:アマゾンスクレイピング
- WebDriverWaitの後でもFirefoxWebElementget_attributeのStaleElementReferenceException
- Python Seleniumを使用するcsvWriterは、0からjまで反復していません。最後のヒットのみを取得し、各ヒットは取得しません
- Python:Selenium Paginationは、ページ1のみをリストに保存し、ページ2、3などは保存しません。
- Seleniumを使用してInstagramから投稿URLを取得するには、スクロールダウンするたびに動的に変更されますか?
- TypeError: 'FirefoxWebElement'オブジェクトは、Seleniumを使用して動的Webページ上のページを循環する反復可能なエラーではありません
- RSeleniumは、各行を個別に実行する場合は実行されますが、コードチャンクで実行する場合は実行されません。
- データからテーブルをスクレイピングした後に文字列を分割する
- YouTubeビデオを再生するにはどうすればよいですか[selenium]
次のコードを使用して、最後のページに到達するまで[次へ]ボタンをクリックし、ボタンが存在しない場合はループを解除できます。