我是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
文件的其他代码,我会粘贴在这里。
任何帮助将不胜感激,提前致谢
答案 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