我使用带有Bottlenose的API并使用BeautifulSoup解析xml响应,从亚马逊中找到产品的价格。 我有一个代码迭代的预定义产品列表。 这是我的代码:
import bottlenose as BN
import lxml
from bs4 import BeautifulSoup
i = 0
amazon = BN.Amazon('myid','mysecretkey','myassoctag',Region='UK',MaxQPS=0.9)
list = open('list.txt', 'r')
print "Number", "New Price:","Used Price:"
for line in list:
i = i + 1
listclean = line.strip()
response = amazon.ItemLookup(ItemId=listclean, ResponseGroup="Large")
soup = BeautifulSoup(response, "xml")
usedprice=soup.LowestUsedPrice.Amount.string
newprice=soup.LowestNewPrice.Amount.string
print i , newprice, usedprice
此工作正常,将贯穿我的亚马逊产品列表,直到它获得的产品对该组标签没有任何价值,like no new/used price.
Python将抛出此响应:
AttributeError: 'NoneType' object has no attribute 'Amount'
这是有道理的,因为我找不到BS找到的标签/字符串。从我想要实现的目标来看,没有任何价值是完全正常的,但是代码在此时崩溃并且不会继续。
我试过了:
if soup.LowestNewPrice.Amount != None:
newprice=soup.LowestNewPrice.Amount.string
else:
continue
并尝试过:
newprice=0
if soup.LowestNewPrice.Amount != 0:
newprice=soup.LowestNewPrice.Amount.string
else:
continue
在收到非类型值返回后,我对如何继续感到茫然。不确定问题是否基本上存在于语言或我使用的库中。
答案 0 :(得分:2)
您可以使用异常处理:
try: newprice=soup.LowestNewPrice.Amount.string
except AttributeError: newprice=0
try: usedprice=soup.LowestUsedPrice.Amount.string
except AttributeError: usedprice=0
print i , newprice, usedprice
将执行try块中的代码,如果引发AttributeError,执行将立即进入except块(这将导致循环中的下一项运行)。如果没有引发错误,代码将很乐意跳过except块。
如果您只想将缺失值设置为零并打印,则可以执行
{{1}}
答案 1 :(得分:0)
与“无”进行比较的正确方法是is None
,而不是== None
或is not None
,而不是!= None
。
其次,您还需要检查soup.LowestNewPrice
是否为无,而不是Amount
,即:
if soup.LowestNewPrice is not None:
... read soup.LowestNewPrice.Amount