这是我第一次使用 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 评论