2017-05-31 119 views
0

我一直在尝试从网站下载数据,然后将其保存到csv文件。问题是:我无法以正确的方式将其读取或导入到数据库中。Python:将数据从BeautifulSoup保存到CSV

这里是我的代码:

import csv 
import requests 
from bs4 import BeautifulSoup 

def getData(url_to_scrap='https://www.investing.com/currencies/eur-usd-historical-data', file=None, save_file="Name.csv"): 

    if url_to_scrap is not None: 
     header = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36'} 
     r = requests.get(url_to_scrap, headers=header) 
     data = BeautifulSoup(r.content, 'html.parser') 
    else: 
     data = BeautifulSoup(open(file, encoding='utf8'), 'html.parser') 


    table = data.find(id='curr_table') 
    table = table.find_all('td') 

    row_data = [] 
    for row in table: 
     row_data.append(row.get_text('data-real-value')) 

    with open(save_file, 'w') as save: 
     for row in row_data: 
      writer = csv.writer(save, delimiter=';') 
      writer.writerow(row) 

getData(save_file="EUR USD Historical Data.csv") 

而且CSV文件输出:

M;a;y; ;3;1;,; ;2;0;1;7 

1;.;1;2;1;8 

1;.;1;1;7;2 

1;.;1;2;2;0 

.... 

我需要什么:

May 31, 2017;1.1218;1.1172;1.1220;1.1165;0.30% 

如果您检查网站,一切都在一个表中,我需要它类似于csv。 我应该改变什么才能使它工作?

回答

0

制备亚列表(via):

with open(save_file, 'wb') as save: 
    writer = csv.writer(save, delimiter=';') 
    for row in [row_data[x:x+6] for x in xrange(0, len(row_data), 6)]: 
     writer.writerow(row) 

#May 31, 2017;1.1242;1.1172;1.1252;1.1165;0.51% 
#May 30, 2017;1.1185;1.1163;1.1207;1.1108;0.18% 
#May 29, 2017;1.1165;1.1177;1.1192;1.1159;-0.16% 
#... 

(如注意到here,xrange如果您使用的是Python 3,则可能需要range;我在Python 2和初学者,所以...)

+0

thank you for your answer,it made the script better,but now need to remove the extra blank lines in the csv。我只是把''open(save_file,'wb')'改成''打开(save_file,'w')'**。现在,我怎样才能删除多余的空行?编辑:** @ njoosse **只是使用链接来阅读它,并使用'lineterminator ='\ n'' –

+0

@VascoFerreira嗯为什么你把wb设回b?我建议你可以按照建议使用'wb'来移除多余的换行符。 (见[这里](https://stackoverflow.com/questions/23835866/many-tutorials-on-writing-csv-files-have-the-mode-set-to-wb-why)) – lukeA

+0

@VascoFerreira So lineterminator会是wb的替代品吗?很高兴知道。如果你的问题解决了,你可以选择一个答案标记为已解决。 – lukeA

0

编辑

当你追加字符串到行列表中,将其追加为列表

row_data.append([row.get_text('data-real-value')])

,让你有一个字符串列表的列表。

更多示例请参阅Python csv library leaves empty rows even when using a valid lineterminator

保留writerows如下所示,每行打印一个项目。

with open(save_file, 'w') as save: 
     writer = csv.writer(save, delimiter=';') 
     writer.writerows(row) 

,因为它会放置分隔各个元素之间的名单从row_data列表长度六部(= 1行)

+0

它不起作用,输出保持如下:'2017年5月31日; 1.1240; 1.1172; 1.1252; 1.1165; 0.49%; 2017年5月30日; 1.1185; 1.1163; 1.1207; 1.1108; 0.18%; 5月29日'所有在一起。 –

+0

只是使用链接来阅读它,并使用'lineterminator ='\ n''来删除多余的空白行。 'authorows(row)'does not work,but I've used the answer of @lukeA –