如何在Python中缩短一长串例外?

时间:2018-10-08 15:27:54

标签: python exception web-scraping attributeerror

我是编程新手,我正在尝试处理Web抓取程序中的错误。我通过3个网站(A,B和C)从产品列表中进行迭代,以查找产品的名称和价格。例如,我想要此输出:

print(productA, priceA, productB, priceB, productC, price C)

但是有时某些产品不存储价格或产品名称,因为它们可能缺货,或者找不到它并带来AttributeError

因此,我在程序上添加了一长串例外,以在每种情况下都找不到所需的商品名称或价格,以打印“不可用”。

try:
    print(productA, priceA, productB, priceB, productC, price C)

except AttributeError:

   try:        
       print("not available", priceA, productB, priceB, productC, price C)

   except AttributeError:

       try:        
           print(productA, "not available", productB, priceB, productC, price C)

       except AttributeError:

           try:        
               print("not available", "not available", productB, priceB, productC, price C)
...

对于这三种产品,依此类推,尝试查看是否缺少一个,两个或三个项目的名称或价格并显示错误。我的问题是,是否有一种方法可以使此操作更容易/更快或自动化,从而使代码不会太长?谢谢

3 个答案:

答案 0 :(得分:1)

实现字典并对其进行迭代的简单示例

d={'product A':'', 'product B':22, 'product C':33}

for key,value in d.items():
    try:
        print('product:{}, price:{}'.format(key,int(value)))
    except Exception:
        print('price for {} is not available'.format(key))

答案 1 :(得分:0)

这是带有伪值的演示,使用ValueError分配的值是无关紧要的,仅用于引发Error来显示如何使用循环来完成。在您的代码中,如果将所有项目放在列表中,然后使用循环来打印每个项目,则为AttributeError,然后如果发现错误,则可以仅打印一条替代消息。如果您希望将所有内容都显示在一行上,则只需在打印语句中添加end = ' '

productA, priceA, priceB, productC, priceC = '1', '10', 'blah', '10', '100'

lista = [productA, priceA, priceB, productC, priceC]
for i in lista:
    try:
        print(int(i))
    except ValueError:
        print('{} is not available'.format(i))
1
10
blah is not available
10
100

答案 2 :(得分:0)

考虑排除以下方面:

  • 您要搜索的商品名称
  • 您要搜索的网站(请记住,以后可能会添加更多网站!)
  • 您在给定站点上找到的名称(如果有)
  • 您在给定站点上找到的价格(如果有)

类似这样的东西:

products = [
    "LED flashlight",
    "AAA battery",
    "AA battery"
]

sites = {
    "Amazon" : "http://amazon.com",
    "Ebay" : "http://ebay.com",
    "Monoprice": "http:monoprice.com"
}

def my_search(url, prodname):
    # your site search code here
    # ...
    return (foundname, foundprice)

for product in products:
    for (site, url) in sites.items():
        (name, price) = my_search(url, product)
            try:
                print(name, end=' ')
            except Exception:
                print("not available", end=' ')
            try:
                print(price, end=' ')
            except Exception:
                print("not available", end=' ')
        print()

进行较小的更改,您可以轻松生成包含列标题的HTML或表格或CSV文件,可以轻松对其进行修改以添加网站或产品。请注意,我上面的正则表达式模式不是好的正则表达式示例!

最后,出于逻辑目的而捕获Exception是一个坏主意,因为那样您将错误处理其他类型的错误(例如有人试图在无限循环中捕获该程序,则试图中止该程序。)找出哪个异常您会发现并捕获该异常。更好的是,如果找不到产品名称或价格,则让您的搜索方法不输入任何内容或“不可用”。