【问题标题】:How to Reduce This Block of Code如何减少这段代码
【发布时间】:2018-07-07 23:53:01
【问题描述】:

我对 Python 完全陌生,刚刚了解了列表理解,这令人印象深刻。我想知道是否有类似的方法可以减少以下if 语句。

if len(browser.find_elements_by_xpath('//span[@gogo-test="backers"]')) > 0:
    backers = [sub for sub in browser.find_element_by_xpath('//span[@gogo-test="backers"]').text.split() if sub.isdigit()][0]

理想情况下,我想使用backers = [sub for sub in browser.find_element_by_xpath('//span[@gogo-test="backers"]').text.split() if sub.isdigit()][0],但是,与 Scrapy 不同的是,Selenium 在找不到任何东西时不会返回None,而且肯定会有browser.find_element_by_xpath('//span[@gogo-test="backers"]') 不存在的情况.

谢谢

【问题讨论】:

  • 有一种方法可以做到这一点(您可以通过将两个条件与and 粘合在一起来将它们放在列表理解中,但我建议不要这样做,因为它会变得非常麻烦。你现在有就好了。
  • @RushabhMehta 但列表理解中的for 循环首先取决于browser.find_element_by_xpath('//span[@gogo-test="backers"]') 是否存在??
  • 这实际上可能会改善这种情况。尝试完全删除 if 子句。看看你得到了什么!我怀疑如果 len = 0,那么支持者将是一个空列表
  • 所以,运行这个backers = [sub for sub in browser.find_element_by_xpath('//span[@gogo-test="backers"]').text.split() if sub.isdigit()],然后看看它有什么。暂时不要选择第一个元素,因为它可能不存在。
  • @RushabhMehta 当然,我想我会尝试删除[0]

标签: python python-3.x python-2.7 selenium


【解决方案1】:

您可以使用 Page-Object-Model 来减少代码块,这是一种常见的 Selenium 约定:

if  page.get_spans_array_size() > 0:
    backers = [sub for sub in  page.get_spans_array() if sub.isdigit()][0]

页面代码:

class Page:

    def __init__(self, driver):
        self.driver = driver

    def get_spans_array_size(self):
        return len(
                   ## self.driver.find..  )

    def get_spans_array(self):
        return ## self.driver.find..  

我的开源项目中有一个 POM 的 python 示例: https://github.com/AutomatedOwl/selenium-python-pom-example

【讨论】:

  • 你能链接到get_spans_array的文档吗?
  • 您应该在单独的页面类中创建它。请参阅我的示例中的 Page 类,了解如何完成它。
  • 你在说你的 git 上的 class Site88Page 吗??
  • 是的,这只是python中页面类的一个例子。 GitHub上有很多。
  • 是的,我不相信这会在我的脚本中起作用,我仍然不确定这与 get_spans_array_size() 方法有何关系?
【解决方案2】:
backers = [sub for sub in browser.find_element_by_xpath('//span[@gogo-test="backers"]').text.split() if sub.isdigit()]
backers = backers[0] if len(backers) > 0 else None

它已经很短了,几乎没有改进的余地:) 或者

backers = list(filter(lambda sub: sub.isdigit(),
                      browser.find_element_by_xpath('//span[@gogo-test="backers"]').text.split()
               ))

backers = backers[0] if len(backers) > 0 else None

或者用正则表达式:

import re
backers = browser.find_elements_by_xpath('//span[@gogo-test="backers"]')
backers = backers[0].text if len(backers) > 0 else ''
backers = re.findall('(\d+)', backers)

【讨论】:

  • hm.. 是的,我看不出这些建议会以任何方式减少:/
  • 正如我所提到的,几乎没有什么可以减少的。据我了解,您只需要从字符串中提取数字。比正则表达式,我会附加这个解决方案来回答。面向对象的解决方案非常适合更复杂的情况。它还会进行两次browser.find_elements_by_xpath('...') 操作。
  • get_elementS_... 如果为空并找到所有列表,则返回列表,get_element _... 引发 Element Not Found 错误以进一步处理
猜你喜欢
  • 1970-01-01
  • 2017-06-17
  • 1970-01-01
  • 2015-03-30
  • 1970-01-01
  • 2019-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多