2015-04-22 57 views
2

我只是想寫一個csv。不過,我有兩個單獨的for語句,因此每個for語句的數據獨立導出並打破順序。建議?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 

從下圖中可以看出,第二個for-statement打印在其他打印機下面,而不打印在其他打印機的「其他」之下。

CSV圖像附:csv file

和GitHub的鏈接,完整的文件:https://github.com/nchlswtsn/scrapy/blob/master/items.csv

+0

您可以上傳CSV文件嗎? – ahmed

+0

@boussouira是!更新 –

回答

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

在Python 2.7的CSV模塊不支持Unicode,因此它建議使用unicodecsv代替。

​​

的unicodecsv是一個簡易替換爲Python 2的CSV模塊支持Unicode字符串沒有麻煩。

然後用這個來代替import csv

import unicodecsv as csv 
+1

我通常在啓動時通過參數導出爲CSV(scrapy crawl myspider -o items.csv)。我可以用unicodecsv以某種方式適應這種情況嗎? –

+1

您必須檢查scrapy正在使用哪個CSV模塊。 [好像他們正在使用常規的CSV模塊。](https://github.com/scrapy/scrapy/search?utf8=%E2%9C%93&q=csv)去python 3和這個問題消失。 – philshem

+0

@Charles Watson你知道如何在啓動時使用unicodecsv嗎?我和你有同樣的問題。 – jkupczak