【问题标题】:Shorten expression for Python exceptions handling缩短 Python 异常处理的表达式
【发布时间】:2015-08-19 10:27:10
【问题描述】:

我正在使用try/except 来检查xpath 从网站输入变量的替代来源。

它必须多次这样做,所以我正在寻找一种缩短表达式的方法。也许可以以某种方式使用上下文管理器?

在此示例中,我正在检查变量 issuername 的两个替代 xpath 源。

try:
    xpath_issuer = ".//*[@id='dv_PRE88f496c28ad6488895f1ffc383fae8bd_list_list']/div/div[3]/table/tbody/tr[2]/td[2]"
    find_issuer = driver.find_element_by_xpath(xpath_issuer)
    issuer = re.search(r"(.+)", find_issuer.text).group()
except NoSuchElementException:
    pass
try:
    xpath_issuer = ".//*[@id='dv_PRE00e883469a264528b20fbbc31b0da4a2_list_list']/div/div[3]/table/tbody/tr[1]/td[2]/a"
    find_issuer = driver.find_element_by_xpath(xpath_issuer)
    issuer = re.search(r"(.+)", find_issuer.text).group()
except NoSuchElementException:
    pass
try:
    xpath_name = ".//*[@id='cols']/div[1]/div[1]/h1"
    find_name = driver.find_element_by_xpath(xpath_name)
    name = re.search(r"(.+)", find_name.text).group()
except NoSuchElementException:
    pass

【问题讨论】:

  • 定义一个接受 XPath 表达式并包含 try/except 代码的函数,如 stackoverflow.com/a/12150013/423105 所示。发生 NoSuchElementException 时让它返回 None 。使用三个不同的 XPath 表达式调用该函数三次……但如果函数返回的结果不是 None,则停止。

标签: python-2.7 xpath exception-handling contextmanager


【解决方案1】:

这个怎么样:

listXPath = [".//*[@id='dv_PRE88f496c28ad6488895f1ffc383fae8bd_list_list']/div/div[3]/table/tbody/tr[2]/td[2]", ".//*[@id='dv_PRE00e883469a264528b20fbbc31b0da4a2_list_list']/div/div[3]/table/tbody/tr[1]/td[2]/a", ".//*[@id='cols']/div[1]/div[1]/h1"]
class Work():
    def __init__(self):
        self.getIssuer()

    def getIssuer(self):
        for i in range(len(listXPath)):
            xPath = listXPath[i]
            try:
                find_issuer = driver.find_element_by_xpath(xpath_issuer)
                issuer = re.search(r"(.+)", find_issuer.text).group()
            except:
                pass

# Run clas
Work()

xpath_issuer 似乎有 3 个不同的选项,所以你循环遍历所有这些选项。然后你设置find_issuer。之后你用issuer 做一些事情。

也许您可以尝试让issuer 返回一些内容,以指示是否找到了某些内容。如果你通过issuer 显然它有效,那么做一个return 语句。

例如:

listXPath = [".//*[@id='dv_PRE88f496c28ad6488895f1ffc383fae8bd_list_list']/div/div[3]/table/tbody/tr[2]/td[2]", ".//*[@id='dv_PRE00e883469a264528b20fbbc31b0da4a2_list_list']/div/div[3]/table/tbody/tr[1]/td[2]/a", ".//*[@id='cols']/div[1]/div[1]/h1"]
class Work():
    def __init__(self):
        x = self.getIssuer()
        print(x)

    def getIssuer(self):
        for i in range(len(listXPath)):
            xPath = listXPath[i]
            try:
                find_issuer = driver.find_element_by_xpath(xpath_issuer)
                issuer = re.search(r"(.+)", find_issuer.text).group()
                return 'DoneIt'
            except:
                pass

# Run clas
Work()

【讨论】:

  • 我看到你的例子中的第三个是issuer。我想我的例子仍然会给你一个想法。你也可以做出2个不同的定义。一张给issuer,一张给name
  • 我尝试了您的解决方案,但我得到了NameError: global name 'issuer' is not defined。知道为什么吗?当它试图将issuer 传递出循环时,就会发生这种情况。只要在循环中,就能找到issuer
  • 它似乎成功运行try,但它也总是运行except,这否定了一切,所以issuer 中没有传递任何内容。是这样吗?
  • 我真的不明白issuer 应该做什么?
  • issuer 是我稍后要写入 csv 的变量。它是用来自find_issuerre.search 提取的,而后者又来自xpath。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-08-11
  • 2017-03-16
  • 1970-01-01
  • 1970-01-01
  • 2016-08-09
  • 2020-12-06
  • 2013-12-23
相关资源
最近更新 更多