2013-04-22 22 views
0

我目前的实现是:Python:如何过滤网页中csv数据的列?

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循环时,一定是错误的。

+0

csv.reader函数接受一个代表**分隔符的参数(在你的情况下它的逗号),使用分隔符解析csv,并且你的问题应该被解决。通过文档获取帮助http://docs.python。 org/2/library/csv.html – 2013-04-22 08:21:56

+0

添加了分隔符参数。修正问题完全显示当前问题。 – imagineerThat 2013-04-23 18:01:27

回答

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所以你不”不得不记得哪一列是哪一个。