2015-12-29 5 views
0

My Hacker News spider выводит все результаты на одну строку, а не одну строку, как это видно здесь.Исчерпание трассы трассы в неправильном формате csv

All on the same line

Вот мой код.

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 среди многих других решений, но не повезло до сих пор. Я все еще очень новичок в этом, поэтому, если это возможно, несите меня.

+0

Как выглядит файл csv в текстовом редакторе? – masnun

+0

Что у вас в трубопроводе? – masnun

+0

http://pastebin.com/kf81aj6C –

ответ

0

Это происходит потому, что ваш конвейер товаров получает все списки сразу. Для примера: 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 
+0

Это сработало! Фантастика! Большое спасибо, я застрял на нем уже 2 дня. –

Смежные вопросы