【问题标题】:webscraping data and use pandas read_html to convert it to dataframe and merge the dataset together网络抓取数据并使用 pandas read_html 将其转换为数据框并将数据集合并在一起
【发布时间】:2018-02-16 00:27:08
【问题描述】:

我对 python 有点陌生,我的代码有一些问题。对于我尝试做的任何建议,我们将不胜感激。

import pandas as pd
from bs4 import BeautifulSoup
import requests

def trade():
tickers = ["AAPL","AMZN", "INTC", "MSFT", "SNAP"]
    for ticker in tickers:
        url = "http://finance.yahoo.com/quote/%s?p=%s"%(ticker,ticker)
        res = requests.get(url)
        soup = (BeautifulSoup(res.content, 'lxml'))
        table = soup.find_all('table')[0]
        df = pd.read_html(str(table))
        print("DF")
        print(df)
        df_string = str(df)
        print(df_string_parse)
        print(type(df_string_parse))

当我查看 df 时,它会显示这样的字符串

[                0                1
 0  Previous Close           167.37
 1            Open           169.79
 2             Bid     157.23 x 300
 3             Ask     157.29 x 500
 4     Day's Range  169.00 - 173.09
 5   52 Week Range  134.84 - 180.10
 6          Volume         51124085
 7     Avg. Volume         33251246]

我想要做的是将每个股票代码的表格存储到数据框中,并将它们合并在一起,如下所示。或者我想如果有办法,我可以把它变成字典,这样我就可以更容易地使用它的变量。

                  APPL    AMAZN    INTC     MSFT    SNAP
Previous Close
Open
Bid
Ask
Day's Range
Volume
Avg. Volume

目前,我面临两个问题:

  1. 使用pd.read_html(str(table))后如何将表格转成数据框和/或字典
  2. 如何分别存储每个代码的结果最终合并 他们在一起?我知道如何使用 for 循环来一一阅读, 但我似乎不知道如何以这种方式存储它们。

【问题讨论】:

    标签: python pandas numpy web-scraping beautifulsoup


    【解决方案1】:

    我会这样做:

    import pandas as pd
    from bs4 import BeautifulSoup
    import requests
    
    def fetch(t):
        url = f'http://finance.yahoo.com/quote/{t}?p={t}'
        res = requests.get(url)
        soup = (BeautifulSoup(res.content, 'lxml'))
        table = soup.find_all('table')[0]
        labels, data = pd.read_html(str(table))[0].values.T
        #                                       ^
        #                             What you were missing
        # pd.read_html returned a list of 1 dataframe
        return pd.Series(data, labels, name=t)
    
    tickers = ["AAPL","AMZN", "INTC", "MSFT", "SNAP"]
    df = pd.concat(map(fetch, tickers), axis=1)
    
                               AAPL                 AMZN           INTC           MSFT           SNAP
    Previous Close           167.37              1451.05          45.38          90.81          19.56
    Open                     169.79              1466.89          45.88          91.21          19.66
    Bid                157.23 x 300       1,373.50 x 100    43.29 x 100    86.19 x 100    19.01 x 300
    Ask                157.29 x 500       1,376.00 x 200    43.43 x 800    86.30 x 500    19.04 x 500
    Day's Range     169.00 - 173.09  1,436.84 - 1,468.94  44.95 - 45.99  90.62 - 92.72  19.58 - 20.57
    52 Week Range   134.84 - 180.10    833.50 - 1,498.00  33.23 - 50.85  63.62 - 96.07  11.28 - 29.44
    Volume                 51129225              5650685       23536349       27823161       40733751
    Avg. Volume            33251246              4689059       34001746       28064627       25027667
    

    【讨论】:

      猜你喜欢
      • 2019-06-25
      • 1970-01-01
      • 2022-01-04
      • 1970-01-01
      • 2019-05-31
      • 1970-01-01
      • 1970-01-01
      • 2021-12-14
      • 1970-01-01
      相关资源
      最近更新 更多