【问题标题】:Selenium element is no longer attached to the DOM Error While Scraping dynamic tableSelenium 元素不再附加到 DOM Error While Scraping dynamic table
【发布时间】:2022-01-05 17:19:54
【问题描述】:

这是我第一次使用 selenium 进行动态分页抓取。 我想关注website。基本上我的想法是我想抓取所有表的 118 页表并存储在一些 json 中。 我试图获得第一张桌子,它打印得很好,但是当我尝试转到下一个按钮时,它抛出异常

     raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.StaleElementReferenceException: Message: The element reference of <tr class="even"> is stale; either the element is no longer attached to the DOM, it is not in the current frame context, or the document has been refreshed

这是我目前尝试过的一小部分代码

driver = webdriver.Firefox(executable_path=GeckoDriverManager().install())
driver.get("https://merolagani.com/Floorsheet.aspx")
for z in (driver.find_elements(By.XPATH, '//tbody/tr')):
    table_data = z.find_elements_by_tag_name('td')
    for td in table_data:
        print(td.text)
        time.sleep(1)
    z.find_element(By.XPATH, "(//a[@title='Next Page'])[2]").click()

这是我第一次抓取动态分页,任何帮助都会很有用,谢谢。

【问题讨论】:

  • 我可以帮助你,但我看到你不接受答案。所以,我很抱歉,但是......
  • 很抱歉,这些答案与我要求的解决方案不符,但我总是支持答案
  • 谢谢你,我现在解决了,你能发布你的答案吗?

标签: python selenium selenium-webdriver web-scraping


【解决方案1】:

StaleElementReferenceException 表示页面 DOM 结构已经更改,而您仍在尝试访问/交互某些 WebElement(我的意思是缓存元素,存储在某个变量中),但是:

  • 该元素不再出现在页面上,或者
  • 另一个元素,将被原始元素的定位器找到

因此,请确保在加载新页面后,刷新所有元素

driver.find_element/driver.find_elements 命令。

对于您的情况,可能会出现这样的问题,例如如果您将初始化元素列表,则对其进行迭代,并且将在循环中执行一些新的页面加载。这会损坏您的原始元素列表。

您应该始终牢记这一点。

我在您的脚本中看到click 调用,这可能会导致StaleElementReferenceException(因为它可能会引发DOM 更改)。

还有引用&lt;tr class="even"&gt; 元素的消息,所以请确保刷新它。


另见https://www.selenium.dev/exceptions/#stale_element_reference

【讨论】:

    【解决方案2】:

    有点迟钝,但我是这样做的。

    total_length = (driver.find_element(By.XPATH, "//span[@id='ctl00_ContentPlaceHolder1_PagerControl2_litRecords']").text)
        z = int((total_length.split()[-1]).replace(']', ''))
        for data in range(1, z + 1):
            driver.find_element(By.XPATH, "(//a[@title='Page {}'])[2]".format(data)).click()
            for value in driver.find_elements(By.XPATH, '//tbody/tr'):
                table_data = value.find_elements_by_tag_name('td')
                print([td.text for td in table_data])
        
        
            time.sleep(2)
    

    【讨论】:

      猜你喜欢
      • 2014-07-15
      • 2014-06-06
      • 2014-10-05
      • 1970-01-01
      • 2021-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多