0

私の現在の実装は次のとおりです。

import csv
import urllib.request
from bs4 import BeautifulSoup
f=urllib.request.urlopen('<my_url_goes_here>')
soup = BeautifulSoup(f.read())
my_csv = csv.reader(soup.pre.text,delimiter=",")
for row in my_csv:
    print(row)

次の形式でデータを印刷したいと考えています。

//datestamp,SvcName,AvgSvcTime,MinSvcTime,MaxSvcTime,SvcVol
2013-03-19 00:00:00,cfmeqdequeue,1,0,10,198
2013-03-19 00:01:00,cfmeqdequeue,1,0,10,198
2013-03-19 00:02:00,cfmeqdequeue,1,0,10,198

ただし、実際の出力は次のようになります。

['c']
['f']
['m']
['e']
['q']
['d']
['e']
['q']
['u']
['e']
['u']
['e']

注:soup.pre.text以下を出力し、適切な改行を含めます。

'\n//datestamp,SvcName,AvgSvcTime,MinSvcTime,MaxSvcTime,SvcVol\n2013-03-19 00:00:00,cfmeqdequeue,1,0,10,198\n2013-03-19 00:01:00,cfmeqdequeue,1,0,10,198\n

したがって、 csv.reader() または for ループを使用すると、何かが間違っているに違いありません。

4

1 に答える 1

1

文字列を渡しcsv.readerています。.text[または十分に近いもの --文字列または bs4 の文字列のようなオブジェクトのいずれかを与えるかどうか思い出せません。] ファイルのようなオブジェクトが必要です。このモジュールを使用してStringIO、ファイルのように動作する文字列を取得し、これを回避できます。たとえば、

>>> import csv
>>> s = '\n//datestamp,SvcName,AvgSvcTime,MinSvcTime,MaxSvcTime,SvcVol\n2013-03-19 00:00:00,cfmeqdequeue,1,0,10,198\n2013-03-19 00:01:00,cfmeqdequeue,1,0,10,198\n'
>>> list(csv.reader(s))[:5]
[[], ['/'], ['/'], ['d'], ['a']]

しかし、あなたは持つことができました

>>> from StringIO import StringIO
>>> list(csv.reader(StringIO(s)))[:5]
[[], ['//datestamp', 'SvcName', 'AvgSvcTime', 'MinSvcTime', 'MaxSvcTime', 'SvcVol'], ['2013-03-19 00:00:00', 'cfmeqdequeue', '1', '0', '10', '198'], ['2013-03-19 00:01:00', 'cfmeqdequeue', '1', '0', '10', '198']]

.strip()特に使用したい場合は、不要な空白を削除するためにテキストを呼び出したい場合があることに注意してくださいDictReader。これにより、どの列がどれであるかを覚えておく必要がなくなります。

于 2013-04-23T18:12:26.287 に答える