python selenium webscraping“NoSuchElementException”无法识别
Posted
技术标签:
【中文标题】python selenium webscraping“NoSuchElementException”无法识别【英文标题】:python selenium webscraping "NoSuchElementException" not recognized 【发布时间】:2013-10-12 14:09:03 【问题描述】:有时我会在页面上寻找可能存在或不存在的元素。我想用NoSuchElementException
尝试/捕捉这种情况,当某些 html 元素不存在时,硒会抛出这种情况。原始异常:
NoSuchElementException: Message: u'Unable to locate element: "method":"css selector","selector":"#one"' ; Stacktrace:
at FirefoxDriver.prototype.findElementInternal_ (file:///var/folders/6q/7xcjtgyj32nfc2yp_y5tr9pm0000gn/T/tmp63Mz2a/extensions/fxdriver@googlecode.com/components/driver_component.js:8899)
at FirefoxDriver.prototype.findChildElement (file:///var/folders/6q/7xcjtgyj32nfc2yp_y5tr9pm0000gn/T/tmp63Mz2a/extensions/fxdriver@googlecode.com/components/driver_component.js:8911)
at DelayedCommand.prototype.executeInternal_/h (file:///var/folders/6q/7xcjtgyj32nfc2yp_y5tr9pm0000gn/T/tmp63Mz2a/extensions/fxdriver@googlecode.com/components/command_processor.js:10840)
at DelayedCommand.prototype.executeInternal_ (file:///var/folders/6q/7xcjtgyj32nfc2yp_y5tr9pm0000gn/T/tmp63Mz2a/extensions/fxdriver@googlecode.com/components/command_processor.js:10845)
at DelayedCommand.prototype.execute/< (file:///var/folders/6q/7xcjtgyj32nfc2yp_y5tr9pm0000gn/T/tmp63Mz2a/extensions/fxdriver@googlecode.com/components/command_processor.js:10787)
具有讽刺意味的是,它不会让我捕捉到它之前抛出的这个异常?代码在这里:
elt = driver.find_element_by_css_selector('.information')
try:
dat1 = elt.find_element_by_css_selector('#one').text
dat2 = elt.find_elements_by_css_selector('#two')[1].text
text = dat1 + dat2
except NoSuchElementException:
text = elt.find_element_by_css_selector('#all').text
item.set_description(text)
此处出错:
NameError: name 'NoSuchElementException' is not defined
谷歌搜索/文档一无所获……让我感到奇怪的是,selenium 可以抛出异常但无法捕获它。
【问题讨论】:
【参考方案1】:需要先导入异常
from selenium.common.exceptions import NoSuchElementException
然后你就可以参考了
except NoSuchElementException:
# handle the element not existing
如果您想在输出中提供异常的详细信息,则可以使用:
except NoSuchElementException as exc:
print(exc) # and/or other actions to recover
【讨论】:
最好只导入您可能使用的异常还是导入整个异常类? 我个人觉得保留一个命名空间通常是一个好主意,所以import selenium.common.exceptions as selexcept
然后使用selexcept.NoSuchElementException
标志给读者,以后可能是你自己包特定的异常。
哇有点感觉我必须这样做,但认为它们必须默认包含异常 xD。 tytyty
我导入了异常,但它仍然只记录Message: Unable to locate element: ...
,如果它没有明确提及NoSuchElementException
?
@oldboy 我已经更新了答案以显示如何获取特定异常的详细信息。【参考方案2】:
你应该使用from selenium.common.exceptions import *
,然后写except NoSuchElementException
【讨论】:
请不要。只需导入您需要的。 导入所有 (*) 不是一个好习惯。只需选择您实际需要的那些 为什么只是“import selenium.common.exceptions”不能工作?有趣.. @FuadAk 如果您使用import selenium.common.exceptions
,那么您需要提供完全限定名称selenium.common.exceptions.NoSuchElementException
,当然您可以使用import selenium.common.exceptions as sex
,然后您可以使用sex.NoSuchElementException
等:-)以上是关于python selenium webscraping“NoSuchElementException”无法识别的主要内容,如果未能解决你的问题,请参考以下文章
selenium ide和selenium python的区别
python+selenium十:selenium的二次封装