1

私はPythonが初めてで、いくつかの分析アカウントにログインしていくつかのデータをCSVに出力する単純なスクレーパーを作成しました。私が CSV に出力している形式は、次のコードで作成した辞書です。

import csv
from collections import OrderedDict
import time
def save_file(website, visitors, links, sources):
    date = time.strftime("%d/%m/%Y")
    d = OrderedDict()
    d['Title'] =  website    # website string
    d['Date'] = date         # date string
    d['Vistors'] = visitors  # integer
    d['Links'] = links       # dictionary of links - URL : Clicks
    d['Sources'] = sources   # dictionary of sources - Source: Clicks

    path = os.path.expanduser('~/Desktop/Traffic Report.csv')
    with open(path, 'a') as f:
        writer = csv.DictWriter(f, d, delimiter=',')
        writer.writerow(d)

このコードを使用して CSV に出力すると、サイト、日付、および訪問者のセルがうまく機能します。以下に示すように、リンク/ソース セル (ビューティフルスープを使用してスクレイピングしているデータ) は、余分な引用符と文字でいっぱいです。

{"['www.example1.com/']": '1', "['www.example2.com']": '1', "['www.example3.com']": '1', "['www.example4.com/']": '3', "['www.example5.com/']": '1'}
{"['Links']": '2', "['Social media']": '5', "['Direct']": '2', "['Searches']": '1'}

これらの文字の多くを削除してcsvに出力する方法はありますか: www.example1.com : 1, www.example2.com : 1, www.example3.com : 1...

どんな助けでも大歓迎です!

4

2 に答える 2

1

書式設定は自分で行う必要があります。辞書の代わりに、文字列を作成します。

d['Links'] = ', '.join(['{}: {}'.format(*item) for item in links.items()])
d['Sources'] = ', '.join(['{}: {}'.format(*item) for item in sources.items()])

これにより、link1: count1, link2: count2結果が生成されます。

OrderedDict補足として、ここでオブジェクトを使用する必要はありませんDictWriter。代わりに、書きたい順序で一連のキーを指定するだけです。また、ループの外でCSV ファイルを1 回だけ開きます。

d = {
    'Title': website,
    'Date': date,
    'Visitors': visitors,
    'Links': ', '.join(['{}: {}'.format(*item) for item in links.items()]),
    'Sources': ', '.join(['{}: {}'.format(*item) for item in sources.items()],
}

path = os.path.expanduser('~/Desktop/Traffic Report.csv')
with open(path, 'a') as f:
    fields = ('Title', 'Date', 'Visitors', 'Links', 'Sources')
    writer = csv.DictWriter(f, fields, delimiter=',')
    writer.writerow(d)
于 2014-02-24T13:42:30.580 に答える
1
def convert(dct):
    return ", ".join("%s : %s" % (key, value) for key, value in dct.iteritems())

( if Python3.x.items()の代わりに使用).iteritems()

d['Links'] = convert(links)
d['Sources'] = convert(sources)
于 2014-02-24T13:42:54.620 に答える