我目前正试图在一个网站上获取3d打印机的价格,但我经常遇到这个错误。这是代码:
import selenium
driver = webdriver.Chrome()
driver.get('https://www.dx.com/p/creality-cr10-v2-upgrade-ultraquiet-twoway-sphenoid-cooling-3d-printer-eu-plug-2711457.html#.Xy6c1SgzZhE')
price = driver.find_elements_by_class_name('low-sale-price')
p = price
if not p:
print('Printer out of stock')
if price != "":
for val in price:
a = val.text
b = str(a)
print(b)
break
这就是错误:
Traceback (most recent call last):
File "C:UsersschamDesktopPrinterCrawler.py", line 117, in <module>
DealExtremeEnder()
File "C:UsersschamDesktopPrinterCrawler.py", line 111, in DealExtremeEnder
c = post.text
File "C:UsersschamAppDataLocalProgramsPythonPython38-32libsite-
packagesseleniumwebdriverremotewebelement.py", line 76, in text
return self._execute(Command.GET_ELEMENT_TEXT)['value']
File "C:UsersschamAppDataLocalProgramsPythonPython38-32libsite-
packagesseleniumwebdriverremotewebelement.py", line 633, in _execute
return self._parent.execute(command, params)
File "C:UsersschamAppDataLocalProgramsPythonPython38-32libsite-
packagesseleniumwebdriverremotewebdriver.py", line 321, in execute
self.error_handler.check_response(response)
File "C:UsersschamAppDataLocalProgramsPythonPython38-32libsite-
packagesseleniumwebdriverremoteerrorhandler.py", line 242, in check_response
raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.StaleElementReferenceException: Message: stale element reference: element
is not attached to the page document
(Session info: chrome=84.0.4147.105)
我们将不胜感激。提前谢谢。
我的猜测是price
中元素的循环导致了StaleElementReferenceException
——这意味着price
列表中的一个元素在DOM中发生了更改,需要再次调用driver.find_elements
才能"刷新";具有非过时引用的元素。
您可以尝试修改您的代码,以便在price
:中重新查找元素列表
import selenium
driver = webdriver.Chrome()
driver.get('https://www.dx.com/p/creality-cr10-v2-upgrade-ultraquiet-twoway-sphenoid-cooling-3d-printer-eu-plug-2711457.html#.Xy6c1SgzZhE')
price = driver.find_elements_by_class_name('low-sale-price')
p = price
if not p:
print('Printer out of stock')
if price != "":
for val in price:
a = val.text
b = str(a)
print(b)
# refresh price element list before re-iterating the loop
price = driver.find_elements_by_class_name('low-sale-price')
break