gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 16:20:41 25 4
gpt4 key购买 nike

我正在尝试以最 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 ) )

因此,为了将其分开,我正在尝试执行以下操作:
  • 通过使用 enumerate 并从控件中获取项目并将该枚举列表提交给 map 来迭代选择字段中的每个选项。函数基本上“遍历”每个列表项
  • map 使用 lambda 函数执行函数
  • 将项目列表(枚举以获取索引)提交给 lambda 函数
  • 使用传递项中的枚举索引,在表单控件中选择该项并选择它
  • 提交表格
  • 阅读新浏览器窗口的内容和 print()它回到标准输出

  • 当然在这种情况下 selected链式方法的属性计算为 bool 值并发出以下错误:
    AttributeError: 'bool' object has no attribute 'submit'

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

    有什么想法吗?

    最佳答案

    最“Pythonic”的方式是最易读的方式。如果 for 循环对您有用,则当然不需要执行映射、过滤器或 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 .

    关于python Mechanize 迭代选择选项并使用lambda提交,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18798126/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com