Как обрабатывать пропущенные элементы в цикле for - PullRequest
0 голосов
/ 14 октября 2018

Я использую Amazon Product API с бутылочным носом, и при итерации по XML-ответу я обнаружил ошибки нулевого типа.

Я думаю, что мне наполовину удалось их обработать, однако он не будет извлекать другиеинформация, если он сталкивается с этой ошибкой, таким образом, показывая меньше результатов, чем есть.

Есть ли способ обработать это должным образом, чтобы вся информация была извлечена и ошибка игнорировалась?

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})

Вв данном случае это, в частности, LowestUsedPrice, если элемент не имеет этого тега, возникает ошибка.
Я новичок в Python и программирую, так стараюсь изо всех сил ...

Ответы [ 3 ]

0 голосов
/ 14 октября 2018

continue переходит к следующей итерации цикла, поэтому вы пропускаете остаток тела цикла.Вместо этого вы должны присвоить переменной значение по умолчанию.

if int_qty_u > 0:
    lup = i.LowestUsedPrice.FormattedPrice.text
else:
    lup = "some default value"
0 голосов
/ 14 октября 2018

Вы также можете попробовать добавить проверку, если элемент имеет тег LowestUsedPrice:

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 and i.LowestUsedPrice != None:
    lup = i.LowestUsedPrice.FormattedPrice.text
else:
    lup = 'null'

price_list.append({'Lowest New Price': lnp, 'Lowest Used Price': lup, 'Quantity New': qty_n, 'Quantity Used': qty_u})
0 голосов
/ 14 октября 2018

Я полагаю, у вас проблема с отступами.Python определяет блок по отступу.Ваша структура if / else находится вне цикла 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})

Кроме этого, используйте предложение try-exc для обработки исключительных значений или случаев и возврата программы в допустимое состояние.Примером может быть:

 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:

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})
...