首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >利用BeautifulSoup刮取财务数据

利用BeautifulSoup刮取财务数据
EN

Stack Overflow用户
提问于 2020-07-08 17:05:29
回答 1查看 107关注 0票数 0

我正在尝试使用BeautifulSoup刮取数据。

但是,由于某些原因,函数博客没有正常工作,所以代码是从这个BeautifulSoup中提取的。

守则如下:

代码语言:javascript
代码运行次数:0
运行
复制
# Define The Method To Extract Fundamental Data
def fundamental_metric(soup, metric):
    return soup.find(text=metric).find_next(class_='snapshot-td2').text

def get_fundamental_data(df):
    for symbol in df.index:

        url = ("http://finviz.com/quote.ashx?t=" + symbol.lower())
        soup = bs(requests.get(url).content, features='html5lib')
        for m in df.columns:
            try:
                df.loc[symbol, m] = fundamental_metric(soup, m)
            except Exception as e:
                print(symbol, 'not found')
                print(e)
                break
    return df

# Define A List Of Stocks And The Fundamental Metrics

stock_list = ['AMZN', 'GOOG', 'PG', 'KO', 'IBM', 'DG', 'XOM',
              'KO', 'PEP', 'MT', 'NL', 'ALDW', 'DCM', 'GSB', 'LPL']
metric = ['P/B',
          'P/E',
          'Forward P/E',
          'PEG',
          'Debt/Eq',
          'EPS (ttm)',
          'Dividend %',
          'ROE',
          'ROI',
          'EPS Q/Q',
          'Insider Own'
          ]

df = pd.DataFrame(index=stock_list, columns=metric)
df = get_fundamental_data(df)
print("All stocks with fundamental data")
print(df.head())

我得到的结果是没有找到列表中的那些值,并且对象没有属性Find_next,但是它不应该显示它。我尝试了列表+网站url上的代码,它可以工作,但是当我把它放到python中时,它就没有了。它展示了这样的东西:

代码语言:javascript
代码运行次数:0
运行
复制
AMZN not found
'NoneType' object has no attribute find_next

如果您知道BeautifulSoup不能正常工作的原因,我将非常感激。

最好的!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-07-08 17:47:53

问题是,您正在搜索的页面已经从博客文章(2018年3月12日)开始更新,现在它们要求您在发送给他们的HTTP请求中有一个标头

如果您不添加标题,那么它们将不允许您访问查看HTML。

所以,如果像这样添加标题

代码语言:javascript
代码运行次数:0
运行
复制
...
HEADERS = {'User-Agent': 'Chrome/50.0.2661.102 Safari/537.36'}
...
def get_fundamental_data(df):
    for symbol in df.index:

        url = ("http://finviz.com/quote.ashx?t=" + symbol.lower())
        soup = bs(requests.get(url, headers=HEADERS).content, features='html5lib')
        ...

然后它就能工作了,你就可以得到数据。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62799938

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档