Как создать Обходной путь NoneType Error, возникающий в функциональном входе со случайным набором нетипов - PullRequest
0 голосов
/ 27 февраля 2019

У меня есть ситуация, когда набор данных, поступающий в код, создает ошибку NoneType.После нескольких попыток обойти ошибку, я не уверен, как пересмотреть код для этого.Вот обратная трассировка.

Traceback (most recent call last):
  File "A:\anoth\test.py", line 64, in <module>
    pretty_print(master)
  File "A:\anoth\\test.py", line 53, in pretty_print
    categories = find_elms(soup, 'div', {'id': 'categories'})
  File "A:\anoth\\test.py", line 37, in find_elms
    for region in regions:
TypeError: 'NoneType' object is not iterable

Следующий цикл if-then не работал, когда данные NoneType вводят код.

regions = soup.find(tag, attribute)
print('this ' + str(regions))
for region in regions: #this works for portions of the data set
    if [elm.text for elm in regions.find_all('a')] is None:
        return [] 
    else:
        return [elm.text for elm in regions.find_all('a')]

return []

Есть идеи?

Ответы [ 3 ]

0 голосов
/ 27 февраля 2019

Причина, по которой ваш код не работает, заключается в том, что regions в какой-то момент равен None, и вы пытаетесь перебрать None в цикле for, следовательно, ошибка 'NoneType' object is not iterable

regions = soup.find(tag, attribute)  #<------ this is returning None
print('this ' + str(regions))
for region in regions: #<-- you can't take a region in regions, when regions is None
    if [elm.text for elm in regions.find_all('a')] is None:
        return [] 
    else:
        return [elm.text for elm in regions.find_all('a')]

return []

Вы можете добавить туда try except:

try:
    regions = soup.find(tag, attribute)
    print('this ' + str(regions))
    for region in regions: #this works for portions of the data set
        if [elm.text for elm in regions.find_all('a')] == []:
            return [] 
        else:
            return [elm.text for elm in regions.find_all('a')]

except:
    print ('regions is NoneType object')
    return []
0 голосов
/ 27 февраля 2019

Во-первых, регионы могут быть None, поэтому вам необходимо проверить это:

if regions:
    for region in regions:
        # do stuff

Следующая строка также проблематична:

if [elm.text for elm in regions.find_all('a')] is None:

Понимание списка будетникогда не возвращайся None.С другой стороны, если regions.find_all('a') вернет None, вы получите ту же ошибку.Так что попробуйте:

region_a_tags = regions.find_all('a')
if region_a_tags:
    return [elm.text for elm in region_a_tags]
else:
    return []
0 голосов
/ 27 февраля 2019
if regions:
  for region in regions:
      if some_thing_is_true_about_the_region:
          do_some_thing 
      else:
         do_some_thing_else 
else:
  do_some_thing_for_none_regions
...