Извлечение конвейера scrapy в неправильном формате csv

Паук My Hacker News выводит все результаты в одну строку, а не по одной в каждой строке, как это можно увидеть здесь.

Все в одной строке

Вот мой код.

import scrapy
import string
import urlparse
from scrapy.selector import Selector
from scrapy.selector import HtmlXPathSelector
from scrapy.contrib.linkextractors import LinkExtractor


class HnItem(scrapy.Item):
    title = scrapy.Field()
    link = scrapy.Field()
    score = scrapy.Field()  

class HnSpider(scrapy.Spider):
    name = 'hackernews'
    allowed_domains = ["news.ycombinator.com"]
    start_urls = ["https://news.ycombinator.com/"]

    def parse(self, response):
        sel = response

        selector_list = response.xpath('.//table[@class="itemlist"]')


        for sel in selector_list:
            item = HnItem()


            item['title'] = sel.xpath('.//td[@class="title"]/text()').extract()
            item['link'] = sel.xpath('.//tr[@class="athing"]/td[3]/a/@href').extract()
            item['score'] = sel.xpath('.//td[@class="subtext"]/span/text()').extract()

            yield item

и мой файл settings.py

BOT_NAME = 'hnews'

SPIDER_MODULES = ['hnews.spiders']
NEWSPIDER_MODULE = 'hnews.spiders'

USER_AGENT = 'hnews (+http://www.yourdomain.com)'

FEED_URI = '/used/scrapy/hnews/%(name)s/%(time)s.csv'
FEED_FORMAT = 'csv'

Я пытался реализовать this среди многих других решений, но пока безуспешно. Я все еще новичок в этом, так что потерпите меня, если возможно.


person Robert C    schedule 29.12.2015    source источник
comment
Как это выглядит, когда вы открываете CSV-файл в текстовом редакторе?   -  person masnun    schedule 29.12.2015
comment
Что у вас в разработке?   -  person masnun    schedule 29.12.2015
comment
pastebin.com/kf81aj6C   -  person Robert C    schedule 29.12.2015
comment
Пожалуйста, вставьте пасту или пастебин.   -  person masnun    schedule 29.12.2015


Ответы (1)


Это происходит потому, что ваш конвейер элементов получает сразу все списки. Например: item['title'] получает список всех заголовков сразу, который затем передается в конвейер элементов, а затем напрямую записывается в файл csv.

Решение состоит в том, чтобы перебирать список и передавать его конвейеру элементов по одному. Вот модифицированный код:

import scrapy
from scrapy.selector import Selector


class HnItem(scrapy.Item):
    title = scrapy.Field()
    link = scrapy.Field()
    score = scrapy.Field()  

class HnSpider(scrapy.Spider):
    name = 'hackernews'
    allowed_domains = ["news.ycombinator.com"]
    start_urls = ["https://news.ycombinator.com/"]

    def parse(self, response):
        sel = Selector(response)
        item = HnItem()
        title_list = sel.xpath('.//td[@class="title"]/a/text()').extract()[:-2]
        link_list= sel.xpath('.//tr[@class="athing"]/td[3]/a/@href').extract()
        score_list = sel.xpath('.//td[@class="subtext"]/span/text()').extract()
        for x in range(0,len(title_list)):
            item['title'] = title_list[x]
            item['link'] = link_list[x]
            item['score'] = score_list[x]
            yield item
person Rahul    schedule 29.12.2015
comment
Это сработало! Фантастика! Спасибо большое, вот уже 2 дня застрял на нем. - person Robert C; 29.12.2015