2015-04-22 58 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