谢谢大家-当我试图解析这个代码块时,我无法绕过'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