python selenium处理多个类似的异常

问题描述

我正在抓取一个网页,如果用户下载具有很多交易的文件,其元素会改变

例如,如果网络是“干净的”,我可以通过以下方式访问元素:

start_date = driver.find_element_by_id('zk_comp_172-real')

但是,如果用户手动请求许多事务,则会在页面顶部设置48个小时的指向文件链接,并且所有HTML元素都被“替换”:

enter image description here

因此,我通过尝试捕获方法解决此问题:

try:
    ...
    start_date = driver.find_element_by_id('zk_comp_172-real')
    ...

except:
    ....
    start_date = driver.find_element_by_id('zk_comp_181-real')
    .....

但是事实证明,此ID根据用户已完成的文件请求数量而改变。因此,我尝试捕获两个异常,第一个捕获此错误:...

selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"css selector","selector":"[id="zk_comp_172-real"]"}

和第二个赶上一个

selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"css selector","selector":"[id="zk_comp_181-real"]"}

如果用户请求两个文件,最后一个异常将标识我想要的元素:

 start_date = driver.find_element_by_id('zk_comp_178-real')

但是我不知道如何使用多个除外语句来实现这一点,我已经尝试了下一个

try:
    ...
    start_date = driver.find_element_by_id('zk_comp_172-real')
    ...

except selenium.common.exceptions.NoSuchElementException:
    ....
    start_date = driver.find_element_by_id('zk_comp_181-real')
    .....
except Exception:
    ....
    start_date = driver.find_element_by_id('zk_comp_178-real')
    .....

但是我收到了带有两个异常的回溯,但似乎最后一个除外没有执行:

Traceback (most recent call last)

During handling of the above exception,another exception occurred:

Traceback (most recent call last): ...

这两个异常属于同一类型,所以我不知道如何设置最后一个异常以使其正常工作,对此有何建议?

解决方法

如果我正确理解需求,则需要堆叠例外:

try:
    ...
    start_date = driver.find_element_by_id('zk_comp_172-real')
    ...

except selenium.common.exceptions.NoSuchElementException:
    try:
       ....
       start_date = driver.find_element_by_id('zk_comp_181-real')
       .....
    except selenium.common.exceptions.NoSuchElementException:
       ....
       start_date = driver.find_element_by_id('zk_comp_178-real')
       .....

您还可以将ID添加到列表中并循环直到找到该元素。