我是编程新手,我正在尝试处理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)
...
对于这三种产品,依此类推,尝试查看是否缺少一个,两个或三个项目的名称或价格并显示错误。我的问题是,是否有一种方法可以使此操作更容易/更快或自动化,从而使代码不会太长?谢谢
答案 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
是一个坏主意,因为那样您将错误处理其他类型的错误(例如有人试图在无限循环中捕获该程序,则试图中止该程序。)找出哪个异常您会发现并捕获该异常。更好的是,如果找不到产品名称或价格,则让您的搜索方法不输入任何内容或“不可用”。