首页 > 解决方案 > Python For 循环中的属性错误(返回无) - 雅虎财经

问题描述

我是编码新手,正在尝试使用 BeautifulSoup 抓取各种雅虎财务细节。

我有一个循环遍历多个股票代码的 for 循环。有时,它返回一个属性错误,无。它不会发生在特定的股票上。有时是第 5 只股票,有时是第 400 股……这会导致代码停止。

如何防止这种情况发生,我应该使用什么样的异常/错误处理?

我的代码如下。

import requests
from bs4 import BeautifulSoup
import pandas as pd
from pandas import ExcelWriter

df = pd.read_excel('ASX_Screen_Basic_Materials+Utilities+Energy+Industrials.xlsx')
n = 0
descriptions = []
names = []
sectors = []
industries = []

for index, row in df.iterrows():

    headers = {'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36'}
    url = 'https://finance.yahoo.com/quote/BHP.AX/profile?p=BHP.AX'
    url = url.replace('BHP.AX',str(row['Ticker']))
    r = requests.get(url, headers = headers)
    soup = BeautifulSoup(r.text, 'html.parser')

    description = soup.find('p',{'class': 'Mt(15px) Lh(1.6)'}).text
    descriptions.append(description)
    print(description)

    name = soup.find('h3', {'class': 'Fz(m) Mb(10px)'}).text
    names.append(name)
    print(name)

    sector = soup.find('p', {'class': 'D(ib) Va(t)'}).find_all('span')[1].text
    sectors.append(sector)
    print(sector)

    industry = soup.find('p', {'class': 'D(ib) Va(t)'}).find_all('span')[3].text
    industries.append(industry)
    print(industry)
    n = n+1
    print(n)

descriptions_ouput = pd.DataFrame(descriptions)
print(descriptions_ouput)
writer = ExcelWriter('ASX_Screen_Basic_Materials+Utilities+Energy+Industrials_Descriptions_Export.xlsx')
descriptions_ouput.to_excel(writer)
writer.save()

names_ouput = pd.DataFrame(names)
print(names_ouput)
writer = ExcelWriter('ASX_Screen_Basic_Materials+Utilities+Energy+Industrials_Names_Export.xlsx')
names_ouput.to_excel(writer)
writer.save()

sectors_ouput = pd.DataFrame(sectors)
print(sectors_ouput)
writer = ExcelWriter('ASX_Screen_Basic_Materials+Utilities+Energy+Industrials_Sectors_Export.xlsx')
sectors_ouput.to_excel(writer)
writer.save()

industries_ouput = pd.DataFrame(industries)
print(industries_ouput)
writer = ExcelWriter('ASX_Screen_Basic_Materials+Utilities+Energy+Industrials_Industries_Export.xlsx')
industries_ouput.to_excel(writer)
writer.save()

标签: pythonpandasdataframeerror-handlingyahoo-finance

解决方案


使用yfinance可能会更容易:

!pip install yfinance

import yfinance as yf

tickerData = yf.Ticker("BHP.AX")
tickerDf = tickerData.info
tickerDf

推荐阅读