Python 使用BeautifulSoup刮取财务数据

Python 使用BeautifulSoup刮取财务数据,python,beautifulsoup,Python,Beautifulsoup,我正在尝试使用BeautifulSoup获取数据 代码取自this,但是由于某些原因,函数BeautifulSoup不能正常工作 代码如下: # 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_

我正在尝试使用BeautifulSoup获取数据

代码取自this,但是由于某些原因,函数BeautifulSoup不能正常工作

代码如下:

# 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中时,它不能工作。它显示了如下内容:

AMZN not found
'NoneType' object has no attribute find_next
如果您知道BeautifulSoup无法正常工作的原因,我将不胜感激


最好的

问题在于,您正在搜索的页面自博客发布(2018年3月12日)以来已经更新,他们现在要求您在发送给他们的HTTP GET请求中有一个标题

如果您不添加标题,那么它们将不会授予您查看HTML的权限

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

...
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')
        ...

然后它工作,您就可以得到数据。

您安装了bs4库吗?谢谢您的评论。是的,为了简单起见,我没有把那部分代码放在帖子上。我只是试了一下代码,也没有找到。我想可能是因为这篇博文很老了,也许你正在抓取的资源已经不存在了。现在我正试图为你找到一个解决方案。好吧,现在我有了解决方案。我把它写在答案里