Python:如何从网页中的csv数据中过滤列?

时间:2013-04-22 07:58:29

标签: python csv beautifulsoup urllib

我目前的实施是:

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循环时,一定有问题。

1 个答案:

答案 0 :(得分: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,这样您就不必记住哪个列是哪个。