2012-05-30 43 views
1

我不得不從一個站點刮項目,我把他們安置在以JSON文件,如下面安排每列一個項目的CSV文件的行scrapy蟒蛇

{ 
"author": ["TIM ROCK"], 
"book_name": ["Truk Lagoon, Pohnpei & Kosrae Dive Guide"], 
"category": "Travel", 
} 
{ 
"author": ["JOY"], 
"book_name": ["PARSER"], 
"category": "Accomp", 
} 

我想將它們存儲在CSV一個字典文件每一行在每一個項目一個列如下

| author |  book_name  | category | 
| TIM ROCK | Truk Lagoon ... |  Travel | 
|  JOY  | PARSER   |  Accomp | 

我得到一排一個字典的項目,但與所有的列組合

pipeline.py代碼

導入CSV

class Blurb2Pipeline(object): 

    def __init__(self): 
     self.brandCategoryCsv = csv.writer(open('blurb.csv', 'wb')) 
     self.brandCategoryCsv.writerow(['book_name', 'author','category']) 

    def process_item(self, item, spider): 
     self.brandCategoryCsv.writerow([item['book_name'].encode('utf-8'), 
            item['author'].encode('utf-8'), 
            item['category'].encode('utf-8'), 
            ]) 
     return item   
+1

如果其中一個列表有多個成員,會發生什麼? – kojiro

+0

爲什麼使用列表如果你只有一個作者,是書會有多個名字? – dm03514

+0

我只是在那裏作爲一個例子,實際上我有不止一個成員列表,所以當我運行上述我得到「」TypeError:List沒有編碼方法「」。當一個列表包含多個元素時如何做到這一點。當列表包含一個項目 –

回答

1

的要點是,這是非常簡單,csv.DictWriter

>>> inputs = [{ 
... "author": ["TIM ROCK"], 
... "book_name": ["Truk Lagoon, Pohnpei & Kosrae Dive Guide"], 
... "category": "Travel", 
... }, 
... { 
... "author": ["JOY"], 
... "book_name": ["PARSER"], 
... "category": "Accomp", 
... } 
... ] 
>>> 
>>> from csv import DictWriter 
>>> from cStringIO import StringIO 
>>> 
>>> buf=StringIO() 
>>> c=DictWriter(buf, fieldnames=['author', 'book_name', 'category']) 
>>> c.writeheader() 
>>> c.writerows(inputs) 
>>> print buf.getvalue() 
author,book_name,category 
['TIM ROCK'],"['Truk Lagoon, Pohnpei & Kosrae Dive Guide']",Travel 
['JOY'],['PARSER'],Accomp 

倒不如加入的東西的數組,但是因爲元素可以是列表或字符串,這有點棘手。告訴某些東西是字符串還是其他可迭代的東西是Python中爲數不多的直接類型檢查很有意義的情況之一。

>>> for row in inputs: 
...  for k, v in row.iteritems(): 
...   if not isinstance(v, basestring): 
...    try: 
...     row[k] = ', '.join(v) 
...    except TypeError: 
...     pass 
...  c.writerow(row) 
... 
>>> print buf.getvalue() 
author,book_name,category 
TIM ROCK,"Truk Lagoon, Pohnpei & Kosrae Dive Guide",Travel 
JOY,PARSER,Accomp 
+0

對不起,我有點困惑,上面的例子很清楚,我明白了那我們怎麼能在上面的pipeline.py代碼 –

+0

中實現這個我的意思是我需要把它寫到一個csv文件 –

+0

亞我知道了,如果只有一個字典輸入 –