格式化Scrapy的CSV结果

0 投票
2 回答
1464 浏览
提问于 2025-04-16 12:51

我正在尝试从一个网站上抓取数据,并把结果保存和格式化成一个CSV文件。我能保存文件,但有三个关于输出和格式化的问题:

  • 所有的结果都在一个单元格里,而不是分成多行。是不是我在列出项目时忘记用了什么命令,让它们能以列表的形式显示呢?

  • 我该如何去掉每个结果前面的 ['u... ?(我查过了,知道怎么处理 print 的情况,但对 return 不太清楚)

  • 有没有办法给某些项目的结果添加文本?(比如,我能不能在每个 deallink 结果前面加上 "http://groupon.com"?)

from scrapy.spider import BaseSpider
from scrapy.selector import HtmlXPathSelector

from deals.items import DealsItem

class DealsSpider(BaseSpider):
    name = "groupon.com"
    allowed_domains = ["groupon.com"]
    start_urls = [
        "http://www.groupon.com/chicago/all",
        "http://www.groupon.com/new-york/all"
    ]

    def parse(self, response):
        hxs = HtmlXPathSelector(response)
        sites = hxs.select('//div[@class="page_content clearfix"]')
        items = []
        for site in sites:
            item = DealsItem()
            item['deal1']       = site.select('//div[@class="c16_grid_8"]/a/@title').extract()
            item['deal1link']   = site.select('//div[@class="c16_grid_8"]/a/@href').extract()
            item['img1']        = site.select('//div[@class="c16_grid_8"]/a/img/@src').extract()
            item['deal2']       = site.select('//div[@class="c16_grid_8 last"]/a/@title').extract()
            item['deal2link']   = site.select('//div[@class="c16_grid_8 last"]/a/@href').extract()
            item['img2']        = site.select('//div[@class="c16_grid_8 last"]/a/img/@src').extract()
            items.append(item)
        return items

2 个回答

0

看看这个关于项目管道的文档:http://doc.scrapy.org/topics/item-pipeline.html

这里的 u' 表示的是 Unicode 编码。你可以了解更多信息,看看这个链接:http://docs.python.org/howto/unicode.html

>>> s = 'foo'
>>> unicode(s)
u'foo'
>>> str(unicode(s))
'foo'
2

编辑:现在我对问题有了更好的理解。你的 parse() 函数是不是应该像下面这样?也就是说,应该一次生成一个项目,而不是返回一个列表。我怀疑你返回的那个列表就是导致数据格式不正确地塞进一个单元格里的原因。

def parse(self, response):
    hxs = HtmlXPathSelector(response)
    sites = hxs.select('//div[@class="page_content clearfix"]')
    for site in sites:
        item = DealsItem()
        item['deal1']       = site.select('//div[@class="c16_grid_8"]/a/@title').extract()
        item['deal1link']   = site.select('//div[@class="c16_grid_8"]/a/@href').extract()
        item['img1']        = site.select('//div[@class="c16_grid_8"]/a/img/@src').extract()
        item['deal2']       = site.select('//div[@class="c16_grid_8 last"]/a/@title').extract()
        item['deal2link']   = site.select('//div[@class="c16_grid_8 last"]/a/@href').extract()
        item['img2']        = site.select('//div[@class="c16_grid_8 last"]/a/img/@src').extract()
        yield item

撰写回答