【问题标题】:python mechanize iterate over select options and submit using lambdapython mechanize 迭代选择选项并使用 lambda 提交
【发布时间】:2013-09-14 03:58:02
【问题描述】:

我正在尝试以最 Pythonic 的方式编写此代码,但我刚刚学习 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. 遍历选择字段中的每个选项,方法是使用 enumerate 并从控件中获取项目并将枚举列表提交给 map 函数以基本上“遍历”每个列表项
  2. map 执行的函数使用 lambda 函数
  3. 将项目列表(枚举以获取索引)提交给 lambda 函数
  4. 使用传入项的枚举索引,选择表单控件中的项并选择它
  5. 提交表格
  6. 读取新浏览器窗口的内容并将print()返回到标准输出

当然,在这种情况下,链式方法的 selected 属性计算为布尔值并发出以下错误:

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

但是你知道我想要完成什么,我只是不确定如何,并以最小的占用空间完成它——我可以使用几行和 for 循环让它工作,我只是如果可能的话,尽量远离它。我正在尝试以最 Pythonic 的方式而不是最简单的方式扩展和克服问题。

有什么想法吗?

【问题讨论】:

    标签: python forms map lambda mechanize


    【解决方案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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-23
      • 2016-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多