2013-11-12 2 views
4

Прежде, чем кто-нибудь об этом упоминает, я уже перешел на stackoverflow и Google, чтобы найти ответ на этот вопрос, и я считаю, что я просто ошибаюсь.Извлечение NoneTypes из словаря

Я разбираю XML-документ и помещаю значения в переменные с помощью BeautifulSoup4. Прямо сейчас я читаю значения, перекодированные в словарь и итерации через словарь, чтобы найти нужные мне значения, однако, когда я хочу напечатать эти значения в отчете с шаблоном, я получаю следующую ошибку:

TypeError: coercing to Unicode: need string or buffer, NoneType found 

Который я нашел, является результатом наличия значения None в качестве одного из значений в моем словаре. Решение. Я пытаюсь использовать способ перебора моего словаря в python 2.7 для удаления или замены значений NoneType, но ничего не работает. некоторые решения, которые я нашел, были функцией filter(None, list), for k, v in dictionary: if v in not None: list.append(item), clean = [x for x in list if x != None], используя лямбда, и так далее. Никто из них, похоже, не работает, что заставляет меня поверить, что я должен делать что-то неправильно. Например, это, как я создал свой словарь:

itemDict = [] 

    for item in soup3.find_all('XMLTag'): 
    r = { 
     'definition1': item.Starttag.string, 
     'definition2': item.Stoptag.string, 
     'definition3': item.Filltag.string, 
     'definition4': item.Stoptag2.string, 

    } 
    itemDict.append(r) 

но движется через него, чтобы избавиться или заменить NoneTypes в itemDict была боль. Конечный результат, который я планировал, заключался в том, чтобы помещать элементы в словаре в кусок кода шаблона для печати в виде отчета, например, """<Description>"""+item[0]['definition4']+"""</Description>""". Есть предположения?

EDIT:

решение было на самом деле очень просто благодаря Martijn Питерс и Steve Джессоп.

itemDic = [] 

for newdic in soup3.find_all("XMLTag"): 
s = { 
    'definition1': newdic.Order.string, 
    'definition1': newdic.Code.string, 
    'definition1': newdic.Description.string, 
    } 

for k in s: 
    if s[k] is None: 
     s[k] = '' 

itemDic.append(s) 

Это заменило все NoneTypes, которые натолкнулись на очистку XML, используя BeautifulSoup4 с пустыми строками. Аналогично, приведенный выше код также может заменить любое другое значение, которое пользователь хотел бы получить для данного условия. Так, например, если бы я хотел изменить каждый экземпляр «сказочного» на «все было хорошо», я заменил бы «None» на «fabulous» и пустую строку «,», «это было бы хорошо» и альт! Еще раз спасибо вам, ребята.

+0

Распечатайте словарь до и после кода, чтобы удалить 'None' (или посмотреть его в отладчике). Это скажет вам, является ли это код, не содержащий ошибок, или что-то еще. –

ответ

0
r = { 
    'definition1': item.Starttag.string, 
    'definition2': item.Stoptag.string, 
    'definition3': item.Filltag.string, 
    'definition4': item.Stoptag2.string, 
} 

new_r = dict((k, v) for k, v in r.iteritems() if v is not None) 

Но это выглядит, как если бы вы потом собираетесь писать new_r['definition4'], поэтому удаление ключей с None записей будет просто изменить исключение к другой. Вы должны принять фактическое решение о том, что вы хотите делать с недостающими данными ;-)

+0

В Python 2.7 используйте определение dict '{k: v для k, v в r.iteritems(), если v не является None}'. –

+0

@MartijnPieters: Я нахожу их невозмутимыми. Извиниться перед тем, кто поставил работу для их реализации. –

+0

Можно ли заменить пустую строку для NoneType, используя понимание dict? – user2984511

1

Почему бы не создать словарь без None значений в первую очередь?

tags = ('Starttag', 'Stoptag', 'Filltag', 'Stoptag2') 

for item in soup3.find_all('XMLTag'): 
    r = {} 
    for i, tag in enumerate(tags, 1): 
     value = getattr(item, tag).string 
     if value is not None: 
      r['definition' + str(i)] = value 
    itemDict.append(r) 
+0

отличная идея, не подумал об этом. Но когда я попробовал это, я получил хороший ol 'AttributeError: объект «NoneType» не имеет атрибута «строка», оглядываясь на меня. – user2984511

+0

@ user2984511: Тогда у вас есть значения 'None' * где-то еще *. Этот код будет * никогда * добавлять в словарь значение «Нет». –

+0

@ user2984511: Как вы получаете значения * из * словаря. Используете ли вы 'dict.get()' случайно? –

Смежные вопросы