Search code examples
pythonerror-handlingbeautifulsoupamazon-product-apibottlenose

How to handle skipped items in a for loop


I have been using the Amazon Product API with bottlenose and when iterating over the XML response I have encountered null type errors.

I think I have half managed to handle them however it won't extract the other information if it encounters this error thus showing fewer results than there are.

Is there a way to handle this properly so all the information is extracted and the error is ignored?

price_list = [{}]
    for i in price_search:
      lnp = i.LowestNewPrice.FormattedPrice.text
      qty_n = i.TotalNew.text
      qty_u = i.TotalUsed.text
      int_qty_u = int(qty_u)
    if int_qty_u > 0:
      lup = i.LowestUsedPrice.FormattedPrice.text
    else:
        continue
    price_list.append({'Lowest New Price': lnp, 'Lowest Used Price': lup, 'Quantity New': qty_n, 'Quantity Used': qty_u})

In this instance it is specifically the LowestUsedPrice, if an item doesn't have this tag then the error is raised.
I am new to Python and coding so struggling along as best I can...


Solution

  • I believe you have a bad indentation problem. Python defines a block by its indentation. Your if/else structure is outside the for loop. This is what you might be looking for:

    price_list = [{}]
    for i in price_search:
      lnp = i.LowestNewPrice.FormattedPrice.text
      qty_n = i.TotalNew.text
      qty_u = i.TotalUsed.text
      int_qty_u = int(qty_u)
      if int_qty_u > 0:
          lup = i.LowestUsedPrice.FormattedPrice.text
      else:
          continue
      price_list.append({'Lowest New Price': lnp, 'Lowest Used Price': lup, 'Quantity New': qty_n, 'Quantity Used': qty_u})
    

    Other than that, use a try-except clause to handle exceptional values or cases and return the program to a valid state. An example could be:

     if int_qty_u > 0:
          try:
              lup = i.LowestUsedPrice.FormattedPrice.text
          except: #we catch any exception that could happend
              lup = '<null>' #just to put a string 
    

    for sake of completition i would do a try-except on all the for's block:

    price_list = [{}]
    for i in price_search:
      try:
          lnp = i.LowestNewPrice.FormattedPrice.text
          qty_n = i.TotalNew.text
          qty_u = i.TotalUsed.text
          int_qty_u = int(qty_u)
          if int_qty_u > 0:
              lup = i.LowestUsedPrice.FormattedPrice.text
          else:
             continue
      except:
          lnp,qty_n,qty_u,int_qty_u='null','null','null',-1 #multiple assignment in a bad case
      price_list.append({'Lowest New Price': lnp, 'Lowest Used Price': lup, 'Quantity New': qty_n, 'Quantity Used': qty_u})