【问题标题】:Write to a csv file scrapy写入 csv 文件
【发布时间】:2014-01-10 05:44:09
【问题描述】:

我想在 scrapy 中写入 csv 文件

 for rss in rsslinks:
  item = AppleItem()
  item['reference_link'] = response.url
  base_url = get_base_url(response)
  item['rss_link'] = urljoin_rfc(base_url,rss)
  #item['rss_link'] = rss
  items.append(item)
  #items.append("\n")
 f = open(filename,'a+')    #filename is apple.com.csv
 for item in items:
    f.write("%s\n" % item)

我的输出是这样的:

{'reference_link': 'http://www.apple.com/'
 'rss_link': 'http://www.apple.com/rss '
{'reference_link': 'http://www.apple.com/rss/'
 'rss_link':   'http://ax.itunes.apple.com/WebObjects/MZStore.woa/wpa/MRSS/newreleases/limit=10/rss.xml'}
{'reference_link': 'http://www.apple.com/rss/'
 'rss_link':  'http://ax.itunes.apple.com/WebObjects/MZStore.woa/wpa/MRSS/newreleases/limit=25/rss.xml'}

我想要的是这种格式:

reference_link               rss_link  
http://www.apple.com/     http://www.apple.com/rss/

【问题讨论】:

  • 看标准库中的csv模块
  • 我找到了这个类 scrapy.contrib.exporter.CsvItemExporter(file, include_headers_line=True, join_multivalued=', ', **kwargs) 但我不知道如何在我的代码中使用它?

标签: python csv scrapy


【解决方案1】:

只需使用-o csv 抓取,例如:

scrapy crawl <spider name> -o file.csv -t csv

【讨论】:

  • 我正在为每个域创建一个文件。这将为所有域创建一个文件。
  • 通过修改您的pipelines.py 文件。您不需要上述任何代码,并且可以控制输出格式、顺序和何时导出。我做了类似的事情HERE。定义我自己的 spider_opened(...) 函数。
  • 在较新的scrapy版本中,它似乎是:scrapy runspider &lt;spider name&gt; -o file.csv -t csv
  • 想知道是否假设在这种情况下,如果我们有 2 个不同的解析函数,并且我们想为每个函数编写 2 个单独的文件,可以做到吗?
  • 你能解释一下什么是-t参数
【解决方案2】:

这就是使用 Python3 对我有用的方法:

scrapy runspider spidername.py -o file.csv -t csv

【讨论】:

    【解决方案3】:

    解决此问题的最佳方法是使用 python in-build csv 包。

    import csv
    
    file_name = open('Output_file.csv', 'w') #Output_file.csv is name of output file
    
    fieldnames = ['reference_link', 'rss_link'] #adding header to file
    writer = csv.DictWriter(file_name, fieldnames=fieldnames)
    writer.writeheader()
    for rss in rsslinks:
        base_url = get_base_url(response)
        writer.writerow({'reference_link': response.url, 'rss_link': urljoin_rfc(base_url, rss)}) #writing data into file.
    

    【讨论】:

      【解决方案4】:

      你需要

      1. 写你的标题行;那么
      2. 为每个对象写入条目行。

      你可以这样处理它:

      fields = ["reference_link", "rss_link"] # define fields to use
      with open(filename,'a+') as f: # handle the source file
          f.write("{}\n".format('\t'.join(str(field) 
                                    for field in fields))) # write header 
          for item in items:
              f.write("{}\n".format('\t'.join(str(item[field]) 
                                    for field in fields))) # write items
      

      注意"{}\n".format(s) 给出的结果与"%s\n" % s 相同。

      【讨论】:

      • 更具体。你试图做什么来理解它;你试过在 Python 解释器中测试它的一部分吗?
      • 我试了下其实不行。这是完整的编写程序吗?你还没有关闭格式和 f.write 的括号。
      • 我收到一条错误消息: f.write("{}\n".format('\t'.join(str(field) for field in fields))) # write header exceptions。 ValueError:格式中的零长度字段名称
      • 那么您可能使用的是 Python 2.6 或更早版本。试试"{0}\n".format(...)
      • 是的,这是有效的。但它反复添加标题。所以在链接之间也有标题
      【解决方案5】:

      试试tablib

      dataset = tablib.Dataset()
      dataset.headers = ["reference_link", "rss_link"]
      
      def add_item(item):    
         dataset.append([item.get(field) for fields in dataset.headers])
      
      for item in items:
          add_item(item)
      
      f.write(dataset.csv)
      

      【讨论】:

        【解决方案6】:
        custom_settings = {
                'FEED_URI' : 'Quotes.csv'
            }
        

        【讨论】:

        • 这没有提供问题的答案。要批评或要求作者澄清,请在他们的帖子下方留下评论。 - From Review
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-12-25
        • 2016-06-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-09-16
        相关资源
        最近更新 更多