2015-04-22 5 views
2

Я просто пытаюсь написать csv. Однако у меня есть два отдельных for-statement, поэтому данные из каждого for-statement экспортируются независимо и прерываются. Предложения?Python: Scrapy CSV экспортирует неправильно?

def parse(self, response): 
     hxs = HtmlXPathSelector(response) 
     titles = hxs.select('//td[@class="title"]') 
     subtext = hxs.select('//td[@class="subtext"]') 
     items = [] 
     for title in titles: 
      item = HackernewsItem() 
      item["title"] = title.select("a/text()").extract() 
      item["url"] = title.select("a/@href").extract() 
      items.append(item) 
     for score in subtext: 
      item = HackernewsItem() 
      item["score"] = score.select("span/text()").extract() 
      items.append(item) 
     return items 

Как видно на изображении ниже, вторые для-оператор печатает ниже остальных вместо «среди» других, как заголовок делает.

CSV изображение прилагается: csv file

и GitHub ссылку для полного файла: https://github.com/nchlswtsn/scrapy/blob/master/items.csv

+0

Вы можете загрузить файл CSV? – ahmed

+0

@ boussouira Yup! Обновлено –

ответ

2

Ваш заказ экспортирования элемента логично, что вы найдете в CSV файл, сначала экспортируются все заголовки, тогда все элементы подтекст.
Я думаю, вы пытаетесь ломом статьи HN, вот мое предложение:

def parse(self, response): 
    hxs = HtmlXPathSelector(response) 
    titles = hxs.select('//td[@class="title"]') 
    items = [] 
    for title in titles: 
     item = HackernewsItem() 
     item["title"] = title.select("a/text()").extract() 
     item["url"] = title.select("a/@href").extract() 
     item["score"] = title.select('../td[@class="subtext"]/span/text()').extract() 
     items.append(item) 
    return items 

Я не проверял, но это даст вам идею.

1

Модуль CSV из Python 2.7 не поддерживает Unicode, поэтому он предложил использовать вместо unicodecsv.

$pip install unicodecsv 

unicodecsv является заменой для Csv модуля Python 2, который поддерживает юникод строки без хлопот.

И затем использовать это вместо import csv

import unicodecsv as csv 
+1

Обычно я экспортирую в CSV через аргументы при запуске (scraw crawl myspider -o items.csv). Могу ли я разместить это с помощью unicodecsv? –

+1

Вам нужно будет проверить, какая функция CSV модуля используется. [Кажется, они используют регулярный модуль csv.] (Https://github.com/scrapy/scrapy/search?utf8=%E2%9C%93&q=csv) Переход на python 3, и этот вопрос уходит. – philshem

+0

@Charles Watson Вы выяснили, как использовать unicodecsv при запуске? У меня такая же проблема, как и вы. – jkupczak

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