拨开荷叶行,寻梦已然成。仙女莲花里,翩翩白鹭情。
IMG-LOGO
主页 文章列表 Selenium元素不再附加到抓取动态表时的DOM错误

Selenium元素不再附加到抓取动态表时的DOM错误

白鹭 - 2022-03-03 2093 0 0

这是我第一次使用 selenium 进行动态分页抓取。我想抓取以下网站基本上这个想法是我想抓取所有表 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()

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

uj5u.com热心网友回复:

StaleElementReferenceException 意味着页面 DOM 结构已经更改,而您仍在尝试访问/互动某些 WebElement(我的意思是快取的元素,存盘在某个变量中),但是:

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

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

driver.find_element/driver.find_elements命令。

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

您应该始终牢记这一点。

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

并且讯息参考了该<tr >元素,因此请确保重绘 它。


另请参阅https://www.selenium.dev/exceptions/#stale_element_reference

uj5u.com热心网友回复:

Abit laggy ans 但我是这样做的。

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)
标签:

0 评论

发表评论

您的电子邮件地址不会被公开。 必填的字段已做标记 *