我正在尝试使用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
Run Code Online (Sandbox Code Playgroud)
如/sf/answers/426704771/中所示,可能稍微好一点的解决方案是将except子句定向到函数。这样可以解决横向扩展,但仍然包含许多重复的代码。
对我来说,理想的解决方案是拥有一个可以迭代的语句列表,直到找到一种类型的表单为止。一个非常粗糙的例子是:
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
Run Code Online (Sandbox Code Playgroud)
有可能与此类似吗?
唯一可变的是传递给的关键字参数的名称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')
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
70 次 |
| 最近记录: |