开发者社区> 问答> 正文

最近在学习scrapy,有个保存文件的文件困扰几天了,哪位给指导下,不胜感激!

我要导出为excel文件,用的是openpyxl,下面第一种写法可以保存所有数据。

import scrapy
from clo.items import CloItem

class ClooSpider(scrapy.Spider):
    name = 'cloo'
    allowed_domains = ['2cloo.com']
    start_urls = ['http://www.2cloo.com/sort-shuku_list/s0/o0/od0/st0/w0/u0/v0/p{}'.format(i) for i in range(1,100)]

    def parse(self, response):
        contents = response.xpath('//tbody[@id="resultDiv"]/tr')
        #如果提取tr之前的内容,后面pipilines就不能逐条保存,如果提取上面提取到tr(所有)标签,后面就可以逐条保存,理解不深刻
        for content in contents:
            title = content.xpath('./td[2]/div/a/text()').getall()
            chapter = content.xpath('./td[2]/div/a[2]/text()').getall()
            author = content.xpath('./td[3]/div/text()').getall()
            number = content.xpath('./td[4]/text()').getall()
            click = content.xpath('./td[5]/text()').getall()
            update = content.xpath('./td[6]/text()').getall()
            item = CloItem(title=title,chapter=chapter,author=author,number=number,click=click,update=update)
            yield item

如果把contents = response.xpath('//tbody[@id="resultDiv"]/tr')里面的/tr写到下面的循环里面,也就是

contents = response.xpath('//tbody[@id="resultDiv"]')
        for content in contents:
            title = content.xpath('./tr/td[2]/div/a/text()').getall()
            ....

这样写就只能保存1条数据,求教,这是什么原因?怎么处理?
pipilines都是这样的:

from openpyxl import Workbook

class CloPipeline(object):
    def __init__(self):
        self.wb = Workbook()
        self.ws = self.wb.active
        self.ws.append(['title','chapter','author','number','click','update'])

    def process_item(self, item, spider):
        line = [item['title'][0],item['chapter'][0],item['author'][0],item['number'][0],item['click'][0],item['update'][0]]
        self.ws.append(line)
        return item

    def close_spider(self,spider):
        self.wb.save('clo.xlsx')

展开
收起
特斯拉说话 2018-12-14 08:57:27 2479 0
1 条回答
写回答
取消 提交回答
  • 我都没看openpyxl写入实现,和写入关系不大。 看下面这样改就可以了

    contents = response.xpath('//tbody[@id="resultDiv"]')             这是个table了, 不是tr list了。
    for content in contents.xpath('./tr'):
            title = content.xpath('./td[2]/div/a/text()').getall()
    
    2019-07-17 23:20:53
    赞同 展开评论 打赏
问答分类:
问答标签:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载