4

在任何人提到它之前,我一直在 stackoverflow 和谷歌上寻找答案,我相信我可能只是做错了。

我正在废弃一个 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],使用 lambda 等等。它们似乎都不起作用,这让我相信我一定做错了什么。例如,这是我设置字典的方式:

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)

但是通过它来摆脱或替换 itemDict 中的 NoneTypes 一直很痛苦。我计划的最终结果是将字典中的项目放入一段模板代码中以作为报告打印,例如"""<Description>"""+item[0]['definition4']+"""</Description>"""。有什么想法吗?

编辑:

多亏了 Martijn Pieters 和 Steve Jessop,解决方案实际上非常简单。

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)

这将使用 BeautifulSoup4 从 XML 抓取中遇到的所有 NoneTypes 替换为空字符串。类似地,上面的代码也可以用用户想要的任何其他值替换给定条件。例如,如果我想将 'fabulous' 的每个实例都更改为 'it's just OK',我会将 'None' 替换为 'fabulous' 并将空字符串 '' 替换为 'it was just OK' 和 viola!再次感谢你们。

4

2 回答 2

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)
于 2013-11-12T18:28:44.583 回答
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条目的键只会将异常更改为不同的异常。您应该对丢失的数据做出实际决定;-)

于 2013-11-12T18:27:52.753 回答