python - 如何避免长链的 try 和 except 语句?

标签 python exception

我正在尝试使用 Mechanize python 包来查找网站上的搜索框,以查找网页上的表单。几乎每个网站都以自己的方式定义这些表单,因此我需要搜索一堆不同的签名。由于 Mechanize Browser.select_form 函数在找不到指定表单时会引发异常,因此查找大量不同的表单会变成一长串 try 和 except 语句。

我尝试(或进入)的第一件事是以下结构。它可以工作,但是 1:它看起来不太好,2:扩展很糟糕(如果我需要更多语句,这会变得困惑),3:总的来说,这看起来像是糟糕的代码。

from mechanize import Browser
br = Browser()
br.open(url)
try:
    br.select_form(id=lambda x: 'search' in x)
except Exception:
    try:
        br.select_form(class_=lambda x: 'search' in x)
    except Exception:
        try:
            br.select_form(action=lambda x: 'search' in x)
        except Exception:
            try:
                br.select_form(role=lambda x: 'search' in x)
            except Exception:
                print('NOTHING FOUND')
                pass

一个可能稍微更好的解决方案是将 except 子句定向到函数,如 https://stackoverflow.com/a/6095782/11309912 中所示。 。这可以解决横向扩展,但仍然包含大量重复代码。

对我来说,理想的解决方案是拥有一个可以迭代的语句列表,直到找到一种类型的表单。一个非常粗略的例子是:

forms = ['id=lambda x: 'search' in x', 'class_=lambda x: 'search' in x', .....]
for form in forms:
    try:
        br.select_form(form)
        break
    except Exception:
        pass

类似的事情可能吗?

最佳答案

唯一可变的是传递给 select_form 的关键字参数的名称,您可以像这样传递可变关键字:

for attr in ('id', 'search', 'class_', 'role'):
    try:
        form = br.select_form(**{attr: lambda x: 'search' in x})
        break
    except:
        pass
else:
    print('NOTHING FOUND')

关于python - 如何避免长链的 try 和 except 语句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56456583/

相关文章:

python - 在 python 脚本中使用 youtube-dl 时如何添加后处理选项

python - 给定一个 (Python) Selenium WebElement,我可以获得 innerText 吗?

java - EJB 全局异常处理程序

delphi - 从 DLL 的映射文件中获取源行号

c# - 如何找到在 C# 中抛出的异常的异常类型?

python - 如何在 python 中的类实例之间创建共享对象?

python - 有序字典不排序

python - Pandas DataFrame.drop_duplicates() 缺少一些东西?

java - 异常处理在运行程序中只起作用一次

java - java中捕获异常?