首页 > 解决方案 > 将数据从网页提取到 CSV 文件,仅保存最后一行

问题描述

我面临以下挑战:我想获取有关公司的所有财务数据,我编写了一个代码来完成它,假设结果如下所示:

未命名:0 IQ 2017 II Q 2017 \
0 Przychody netto ze sprzedaży (tys. zł) 137 134   
1 Zysk(地层)z działal。操作。(tys.zł) -423 -358   
2 Zysk (strata) brutto (tys. zł) -501 -280   
3 Zysk (strata) netto (tys. zł)* -399 -263   
4 Amortyzacja (tys. zł) 134 110   
5 EBITDA (tys. zł) -289 -248   
6 Aktywa (tys. zł) 27 845 26 530   
7 Kapitał własny (tys. zł)* 22 852 22 589   
8 Liczba akcji (tys. szt.) 13 921,975 13 921,975   
9 Zysk na akcję (zł) -0029 -0019   
10 Wartość księgowa na akcję (zł) 1641 1623   
11 Raport zbadany przez audytora NN

但要多 464 倍。

不幸的是,当我想将所有 464 个结果保存在一个 CSV 文件中时,我只能保存最后一个结果。不是所有 464 个结果,只有一个……你能帮我保存所有吗?下面是我的代码。

import requests
from bs4 import BeautifulSoup
import pandas as pd    

url = 'https://www.bankier.pl/gielda/notowania/akcje'
page = requests.get(url)

soup = BeautifulSoup(page.content,'lxml')
# Find the second table on the page
t = soup.find_all('table')[0]


#Read the table into a Pandas DataFrame
df = pd.read_html(str(t))[0]

#get 
names_of_company = df["Walor AD"].values

links_to_financial_date = []
#all linkt with the names of companies
links = []

for i in range(len(names_of_company)):
    new_string = 'https://www.bankier.pl/gielda/notowania/akcje/' + names_of_company[i] + '/wyniki-finansowe'
    links.append(new_string)

############################################################################

for i in links:
    url2 = f'https://www.bankier.pl/gielda/notowania/akcje/{names_of_company[0]}/wyniki-finansowe'

    page2 = requests.get(url2)

    soup = BeautifulSoup(page2.content,'lxml')
# Find the second table on the page
    t2 = soup.find_all('table')[0]
    df2 = pd.read_html(str(t2))[0]

    df2.to_csv('output.csv', index=False, header=None)

标签: python-3.xpandasweb-scrapingbeautifulsoup

解决方案


你几乎明白了。您只是每次都覆盖您的 CSV。代替

df2.to_csv('output.csv', index=False, header=None)

with open('output.csv', 'a') as f:
    df2.to_csv(f, header=False)

为了附加到 CSV 而不是覆盖它。

另外,您的示例不起作用,因为:

for i in links:
    url2 = f'https://www.bankier.pl/gielda/notowania/akcje/{names_of_company[0]}/wyniki-finansowe'

应该:

for i in links:
    url2 = i

当网站没有数据时,跳过并继续下一个:

    try:
        t2 = soup.find_all('table')[0]
        df2 = pd.read_html(str(t2))[0]

        with open('output.csv', 'a') as f:
            df2.to_csv(f, header=False)
    except:
        pass

推荐阅读