从xml解析收到无响应后如何继续

时间:2016-02-08 09:55:00

标签: python xml beautifulsoup

我使用带有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

在收到非类型值返回后,我对如何继续感到茫然。不确定问题是否基本上存在于语言或我使用的库中。

2 个答案:

答案 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,而不是== Noneis not None,而不是!= None

其次,您还需要检查soup.LowestNewPrice是否为无,而不是Amount,即:

if soup.LowestNewPrice is not None:
    ... read soup.LowestNewPrice.Amount