2014-07-17 86 views
0

謝謝所有 - 我試圖解析此代碼塊時無法解決'NoneType'錯誤。該錯誤與「製造商」字段有關。我也嘗試將該行的格式與'name'元素的行相似,在這種情況下,我受到KeyError的困擾。謝謝!嘗試解析JSON到csv時出現NoneType錯誤

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:\Py\Pointinside\q1\bb_ext.py", line 39, in <module> 
    row.append(str(product.get('manufacturer',"").encode('utf-8'))) 
AttributeError: 'NoneType' object has no attribute 'encode' 
+0

是否有可能某些產品可能沒有製造商定義? – MattDMo

+0

嗨馬特 - 是的,這正是問題所在。 – Kenfucious

+0

您能否包含回溯? – shaktimaan

回答

2

你的錯誤是你的字典有一個鍵manufacturer,但其價值是None的原因;所以當你做product.get('manufacturer', ''),而不是得到空字符串 - 你得到None,這當然沒有編碼方法。

但是,你str()調用封裝encode電話,如果你只需要調用str()None真正的問題,你就沒有這個問題,因爲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) 
0

什麼ü可以做,以避免這種錯誤是先設置一個變量的值,然後檢查,如果它不是沒有那麼在哪裏繼續,編碼會擊中時的錯誤是沒有價值的。

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