Python:将BeautifulSoup中的数据保存为CSV

Python: Save data from BeautifulSoup to CSV

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

这是我的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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文件上的输出:

1
2
3
4
5
6
7
8
9
M;a;y; ;3;1;,; ;2;0;1;7

1;.;1;2;1;8

1;.;1;1;7;2

1;.;1;2;2;0

....

我需要什么:

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

如果你查看这个网站,所有的东西都在一个表格中,我需要类似的csv格式。我应该做些什么来让它工作?


从您的row_data列表(via)中列出每个长度为6(=1行)的子列表:

1
2
3
4
5
6
7
8
9
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%
#...

(如本文所述,如果您使用的是python 3,那么xrange可能需要是range;我使用的是python 2,而且是初学者,所以…)


编辑

将字符串追加到行列表时,将其追加为列表

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

这样就有了一个字符串列表。

请参阅python csv库,即使在使用有效的lineterminator时,也会留下空行。

保留下面的EDOCX1[1]以每行打印一个项目。

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

因为它将在列表中的每个元素之间放置分隔符