在scrapy中将项目写入csv文件时如何编码列表中的多个项目

时间:2012-05-30 10:57:42

标签: python csv scrapy pipeline

我是scrapy的新手,我抓了一个网站并获取了所有必需的项目,需要将它们写入csv文件。

我的pipeline.py代码是

import csv

class example2Pipeline(object):

    def __init__(self):
        self.brandCategoryCsv = csv.writer(open('example.csv', 'wb'))
        self.brandCategoryCsv.writerow(['book_name','dimensions'])

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

以及上述项目的xpath文件中spider.py代码的结果

book_name = i.select('div[@class="slickwrap full"]/div[@id="bookstore_detail"]/div[@class="book_listing clearfix"]/div[@class="bookstore_right"]/div[@class="title_and_byline"]/p[@class="book_title"]/text()').extract()
Result : [u'Rahul']

dimensions = i.select('div[@class="slickwrap full"]/div[@id="bookstore_detail"]/div[@id="main_tab_group"]/div[@class="panes slickshadow"]/div[@class="pane clearfix"]/div[@class="clearfix"]/div[@class="about_author"]/div[@id="book_stats"]/p/a/text()')[0:2].extract()
Result: [u'Pocket',u'Science Fiction & Fantasy',u' 26 pgs']

如果您在book_name项目上面观察到,则列表中只有一个项目,因此如果我们使用book_name [0],我们将能够按照{{1}中编写的代码对字符串进行编码文件

但是对于pipeline.py项,我们在列表中有多个字符串,所以当我运行上面的dimensions代码时出现以下错误

pipeline.py

那就是我们无法对列表进行编码,我无法对exceptions.AttributeError: 'list' object has no attribute 'encode' 文件中列表中的各个元素进行编码。

另外,我想连续每列写一个项目到csv文件,如

pipeline.py

如果你想要我的book_name | dimensions Pocket Science Fiction & Fantasy, 26 pgs 文件的其他代码,我会粘贴在这里。

任何帮助将不胜感激,提前致谢

3 个答案:

答案 0 :(得分:1)

如果列表中只有unicode字符串,请尝试“”.join(somelist),然后从那里进行编码或str。

答案 1 :(得分:0)

尝试以下..

(item['book_name']).encode('utf-8') ### make sure item['book_name'] is string/unicde becoz they(string/unicode) have encode method not list.

对于换行,你可以尝试..

self.brandCategoryCsv = csv.writer(open('example.csv', 'wb', newline=''))

对下面列表中的每个项目进行编码。

[i.encode('utf-8') for i in item['dimensions']]

答案 2 :(得分:0)

尝试使用python的 map 函数

 def process_item(self, item, spider):
    self.brandCategoryCsv.writerow([map(lambda x: x.encode('utf-8'), item['book_name']),
                                    map(lambda x: x.encode('utf-8'), item['dimensions']),
                                    ])
    return item