试图将JSON解析为csv时出现nontype错误



谢谢大家-当我试图解析这个代码块时,我无法绕过'NoneType'错误。该错误属于"制造商"字段。我还尝试将该行格式化为类似于"name"元素的格式,在这种情况下,我被KeyError困扰。谢谢!

i=1
while i<101:
    print i
    bb_url = urllib2.Request("http://api.remix.bestbuy.com/v1/products(sku=*)?show=sku,name,description,image,manufacturer,upc,department,class,subclass&format=json&sort=sku.asc&page=" + str(i) + "&pageSize=100&apiKey=**************")
    bb_json = json.load(urllib2.urlopen(bb_url))
    print bb_json
    for product in bb_json['products']:
        row = []
        row.append(product['sku'])
        if product['name']:
            row.append(str((product['name']).encode('utf-8')))
        else:
            row.append("")
        row.append(str(product.get('description',"")))
        row.append(str(product['image'])+ " ")
        row.append(str(product.get('manufacturer',"").encode('utf-8')))
        row.append(str(product.get('upc','').encode('utf-8')))
        row.append(str((product['department']).encode('utf-8')))
        row.append(str((product['class']).encode('utf-8')))
        row.append(str((product['subclass']).encode('utf-8')))
        csv_writer.writerow(row)    
    i = i+1

回溯:

Traceback (most recent call last):
  File "C:PyPointinsideq1bb_ext.py", line 39, in <module>
    row.append(str(product.get('manufacturer',"").encode('utf-8')))
AttributeError: 'NoneType' object has no attribute 'encode'

你得到错误的原因是你的字典有一个键manufacturer,但它的值是None;所以当你执行product.get('manufacturer', '')时,你得到的不是空字符串,而是None,它当然没有编码方法。

然而,你的str()调用的真正问题是封装encode调用,如果你只是在None上调用str(),你就不会有这个问题,因为str(None)'None'

:

row.append(str(product.get('manufacturer',"").encode('utf-8')))    
-------------------------------------------------------------^
:后

row.append(str(product.get('manufacturer',"")).encode('utf-8'))
---------------------------------------------^

你也可以去掉一些重复的代码:

field_order = ['sku',
               'name',
               'description',
               'image',
               'manufacturer','upc','department','class','subclass']
row = [str(product.get(k)).encode('utf-8') for k in field_order]
csv.writerow(row)

为了避免这样的错误,你可以做的是首先在一个变量中设置值,然后检查它是否为none,然后你可以继续,当没有值时编码将会出现错误。

    x = .. 
    if x is not None : 
        # do the append and encode

最新更新