【发布时间】:2019-06-05 08:14:32
【问题描述】:
我正在尝试使用 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
有类似的可能吗?
【问题讨论】: