私はSeleniumを初めて使用し、次のように構造化されたリンクのリストを含むWebサイトをスクレイプする必要があります。
<a class="unique" href="...">
<i class="something"></i>
"Text - "
<span class="something">Text</span>
</a>
<a class="unique" href="...">
<i class="something"></i>
"Text - "
<span class="something">Text</span>
</a>
...
...
ループ内のリンクのこのリストをクリックして、結果ページからデータを取得する必要があります。私が今までやってきたことは:
lists = browser.find_elements_by_xpath("//a[@class='unique']")
for lis in lists:
print(lis.text)
lis.click()
time.sleep(4)
# Scrape data from this page (works fine).
browser.back()
time.sleep(4)
最初のループでは問題なく動作しますが、2番目のループが到達すると
print(lis.text)
次のようなエラーがスローされます。
StaleElementReferenceException:メッセージ:古い要素参照:要素はページドキュメントに添付されていません
私が試したところprint (lists)
、すべてのリンク要素のリストが表示されるので、正常に機能します。この問題は、ブラウザが前のページに戻ったときに発生します。browser.get(...)
代わりに時間を延長して使用しようとしましたbrowser.back()
が、それでもエラーが残ります。lis.text
リストにはまだすべての要素のリストが含まれているため、印刷されない理由がわかりません。どんな助けでも大歓迎です。
リンクを起動するのではなく、テキストをクリックしようとしています。
また、各リンクをクリックしてデータをスクレイピングして戻ることも効果的ではないようです。代わりに、すべてのリンクをリストに保存してから、driver.get('some link')
メソッドを使用して各リンクに移動し、データをスクレイピングできます。いくつかの例外を回避できるように、以下の変更されたコードを試してください。
# Locate the anchor nodes first and load all the elements into some list
lists = browser.find_elements_by_xpath("//a[@class='unique']")
# Empty list for storing links
links = []
for lis in lists:
print(lis.get_attribute('href'))
# Fetch and store the links
links.append(lis.get_attribute('href'))
# Loop through all the links and launch one by one
for link in links:
browser.get(link)
# Scrap here
sleep(3)
または、同じロジックを使用する場合は、Fluent Waitを使用して、以下のようなStaleElementReferenceExceptionなどのいくつかの例外を回避できます。
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import *
wait = WebDriverWait(browser, 10, poll_frequency=1, ignored_exceptions=[StaleElementReferenceException])
element = wait.until(EC.element_to_be_clickable((By.XPATH, "xPath that you want to click")))
お役に立てば幸いです...
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加