0

私はスクレイピーで作業しており、Webページから取得したデータをCSVファイルに書き込んでいます

私のpipelineコード:

def __init__(self):
    self.file_name = csv.writer(open('example.csv', 'wb'))
    self.file_name.writerow(['Title', 'Release Date','Director'])

def process_item(self, item, spider):
    self.file_name.writerow([item['Title'].encode('utf-8'),
                                item['Release Date'].encode('utf-8'),
                                item['Director'].encode('utf-8'),
                                ])
    return item 

そして、CSVファイルの私の出力形式は次のとおりです。

Title,Release Date,Director
And Now For Something Completely Different,1971,Ian MacNaughton
Monty Python And The Holy Grail,1975,Terry Gilliam and Terry Jones
Monty Python's Life Of Brian,1979,Terry Jones
.....

ただし、次のような形式の CSV ファイルでtitle、その値を 1 つの列に書き込み、その値をRelease date次の列に書き込み、その値を次の列に書き込むことは可能ですかDirector(CSV はカンマ区切りの値であるため)。

        Title,                                 Release Date,            Director
And Now For Something Completely Different,      1971,              Ian MacNaughton
Monty Python And The Holy Grail,                 1975,     Terry Gilliam and Terry Jones
Monty Python's Life Of Brian,                    1979,              Terry Jones

どんな助けでも大歓迎です。前もって感謝します。

4

2 に答える 2

1

TSV (タブで区切られた値) を使用すると、必要な結果が得られる可能性がありますが、行の長さが大きく異なると見苦しくなります。

このようなテーブルを生成するためのコードを簡単に書くことができます。秘訣は、列の幅を計算するために、出力する前にすべての行を用意する必要があるということです。

インターネットでそのためのスニペットをたくさん見つけることができます。これは私が以前に使用したものです。

于 2012-05-31T07:50:19.030 に答える
1

更新-- 次の目的でコードがリファクタリングされました。

  1. @madjar が提案するジェネレーター関数を使用し、
  2. OP によって提供されるコード スニペットに、より密接に適合します。

ターゲット出力

を使用して別の方法を試していtexttableます。質問と同じ出力が生成されます。この出力はcsvファイルに書き込まれる可能性があります(レコードは適切なcsv方言のためにマッサージする必要がありcsv.writerます.

                  Title,                      Release Date,             Director            
And Now For Something Completely Different,       1971,              Ian MacNaughton        
Monty Python And The Holy Grail,                  1975,       Terry Gilliam and Terry Jones 
Monty Python's Life Of Brian,                     1979,                Terry Jones    

コード

上記の結果を生成するために必要なコードのスケッチを次に示します。

from texttable import Texttable

# ----------------------------------------------------------------
# Imagine data to be generated by Scrapy, for each record:
# a dictionary of three items. The first set ot functions
# generate the data for use in the texttable function

def process_item(item):
    # This massages each record in preparation for writing to csv
    item['Title'] = item['Title'].encode('utf-8') + ','
    item['Release Date'] = item['Release Date'].encode('utf-8') + ','
    item['Director'] = item['Director'].encode('utf-8')
    return item

def initialise_dataset():
    data = [{'Title' : 'Title',
         'Release Date' : 'Release Date',
         'Director' : 'Director'
         }, # first item holds the table header
            {'Title' : 'And Now For Something Completely Different',
         'Release Date' : '1971',
         'Director' : 'Ian MacNaughton'
         },
        {'Title' : 'Monty Python And The Holy Grail',
         'Release Date' : '1975',
         'Director' : 'Terry Gilliam and Terry Jones'
         },
        {'Title' : "Monty Python's Life Of Brian",
         'Release Date' : '1979',
         'Director' : 'Terry Jones'
         }
        ]

    data = [ process_item(item) for item in data ]
    return data

def records(data):
    for item in data:
        yield [item['Title'], item['Release Date'], item['Director'] ]

# this ends the data simulation part
# --------------------------------------------------------

def create_table(data):
    # Create the table
    table = Texttable(max_width=0)
    table.set_deco(Texttable.HEADER)
    table.set_cols_align(["l", "c", "c"])
    table.add_rows( records(data) )

    # split, remove the underlining below the header
    # and pull together again. Many ways of cleaning this...
    tt = table.draw().split('\n')
    del tt[1] # remove the line under the header
    tt = '\n'.join(tt)
    return tt

if __name__ == '__main__':
    data = initialise_dataset()
    table = create_table(data)
    print table
于 2012-05-31T12:16:08.043 に答える