python mechanize迭代选择选项并使用lambda提交

时间:2013-09-14 03:58:03

标签: python forms map lambda mechanize

我正试图用尽可能最蟒蛇的方式写这个,但我现在才开始学习lambda(以及它们可以结合的东西),而且我遇到了一些困难。

使用mechanize模块我正在抓取一个网站以获取选择控件,并尝试将每个选项值提交到表单并阅读结果内容(也许我试图为一点点做太多' ol声明)。这就是我所拥有的:

 f = "ctl00$holdSection$selSubAgentFilter" #the select box field name
 self.br.select_form(nr=0) #make the form selection in the browser instance
 #here's where the magic is done
 map( (lambda item,f=f: print(self.br.form.find_control( f ).items[ item[0] ].selected.submit().read() ) ), enumerate( self.br.find_control( f ).items ) )

所以,为了打破它,我正在努力做到以下几点:

  1. 迭代选择字段中的每个选项,方法是使用枚举并从控件中获取项目并将该枚举列表提交到map函数以基本上“遍历”每个列表项
  2. map执行的函数
  3. 使用lambda函数
  4. 将项目列表(枚举以获取索引)提交给lambda函数
  5. 使用传递项目中的枚举索引,选择表单控件中的项目并选择它
  6. 提交表格
  7. 阅读新浏览器窗口的内容,并print()将其恢复为stdout
  8. 当然,在这种情况下,链式方法的selected属性求值为布尔值并发出以下错误:

    AttributeError: 'bool' object has no attribute 'submit'
    

    但是你知道我想要完成什么,我只是不确定如何,并以最小的占地面积完成它 - 我可以使用几行和for循环工作,我只是试图远离那个,如果可能的话。我试图以最pythonic的方式分支并克服问题,而不是最简单的方法。

    有什么想法吗?

1 个答案:

答案 0 :(得分:1)

最“Pythonic”的方式是最易读的方式。如果for循环对你有效,那么肯定不需要做map,filter或lambda。

何时使用列表推导,地图,过滤器等的一个不错的经验法则是,如果您正在处理数据列表,请使用理解,地图和过滤器。如果您正在执行重复逻辑,例如对列表中的每个项目进行操作,那么您可以执行for循环。

示例1:我需要从列表中过滤掉不必要的数据,因此我需要理解。

new_list = [item for item in list if item.has_special_property]

示例2:我需要为列表中的每个项目运行一些操作,所以我做了一个for循环。

for item in list:
    log_important_info(item)

这些是明显简化的示例,但我希望您看到示例1适用于数据,而示例2适用于代码。

无论如何,我会使用for item in option循环,在表单中选择适当的元素,并在循环内提​​交它。您和其他任何人都会非常清楚地看到您的代码正是您正在做的事情,特别是如果您发表评论。

如果我在项目中遇到它,上面编写的代码很难立即理解。

如果你想了解Pythonic的真正含义,那么我强烈建议你阅读PEP-8