无法准确分割
Unable to split accurately
我正在尝试进行一些股票研究。我正在尝试编写代码以从 Yahoo Finance 获取一些数据。
我试过这段代码,效果很好:
import time
import urllib.request
from urllib.request import urlopen
bsebanks ='HDFCBANK.BO', 'ICICIBANK.BO', 'SBIN.BO'
def yahooKeyStats(stock):
try:
sourceCode = urllib.request.urlopen('https://in.finance.yahoo.com/quote/'+stock+'/key-statistics?p='+stock+'&.tsrc=fin=srch').read()
sourceCodeR = sourceCode.decode('utf-8')
PB = sourceCodeR.split('Price/book</span><!-- react-text: 61 --> <!-- /react-text --><!-- react-text: 62 -->(mrq)<!-- /react-text --><sup aria-label="" data-reactid="63"></sup></td><td class="Fz(s) Fw(500) Ta(end) Pstart(10px) Miw(60px)" data-reactid="64">')[1].split('</td>')[0]
PE = sourceCodeR.split('Trailing P/E</span><!-- react-text: 31 --> <!-- /react-text --><!-- react-text: 32 --><!-- /react-text --><sup aria-label="" data-reactid="33"></sup></td><td class="Fz(s) Fw(500) Ta(end) Pstart(10px) Miw(60px)" data-reactid="34">')[1].split('</td>')[0]
print ('____________________________________')
print (stock)
print ('P/B',PB)
print ('PE',PE)
except:
print ("NA")
for eachStock in bsebanks:
yahooKeyStats(eachStock)
但是,当我尝试添加另一个指标时,比如支出比率,如下所示:
po = sourceCodeR.split('Payout Ratio</span><!-- react-text: 298 --> <!-- /react-text --><!-- react-text: 299 --><!-- /react-text --><sup aria-label="Data provided by Morningstar, Inc." data-reactid="300">4</sup></td><td class="Fz(s) Fw(500) Ta(end) Pstart(10px) Miw(60px)" data-reactid="301">')[1].split('</td>')[0]
print ('PO',po)
它似乎不起作用并且returns NA。
我哪里错了?请帮忙
PS:没学过python。我正在尝试为我的研究构建一个股票筛选器。
对您的代码进行了一些更改。您应该使用 html 解析器来完成这样的工作。
在这里,我使用 Beautiful Soup 以干净的方式解决您的问题。
要求:pip install beautifulsoup4
from urllib.request import urlopen
from bs4 import BeautifulSoup
def yahooKeyStats(name):
url = 'https://in.finance.yahoo.com/quote/{}/key-statistics'.format(name)
page = urlopen(url).read()
soup = BeautifulSoup(page, 'lxml')
pe = soup.find('span', text='Trailing P/E').find_next('td').get_text()
pb = soup.find('span', text='Price/book').find_next('td').get_text()
payout = soup.find('span', text='Payout ratio').find_next('td').get_text()
print("symbol: {}\ntrailing p/e: {}\np/b: {}\npayout: {}\n".format(name, pe, pb, payout))
bsebanks = ['HDFCBANK.BO', 'ICICIBANK.BO', 'SBIN.BO']
for eachStock in bsebanks:
yahooKeyStats(eachStock)
输出:
>> symbol: HDFCBANK.BO
>> trailing p/e: 28.37
>> p/b: 4.32
>> payout: 17.02%
>>
>> symbol: ICICIBANK.BO
>> trailing p/e: 50.00
>> p/b: 2.82
>> payout: 9.78%
>>
>> symbol: SBIN.BO
>> trailing p/e: 24.62
>> p/b: 1.26
>> payout: 0.00%
我正在尝试进行一些股票研究。我正在尝试编写代码以从 Yahoo Finance 获取一些数据。
我试过这段代码,效果很好:
import time
import urllib.request
from urllib.request import urlopen
bsebanks ='HDFCBANK.BO', 'ICICIBANK.BO', 'SBIN.BO'
def yahooKeyStats(stock):
try:
sourceCode = urllib.request.urlopen('https://in.finance.yahoo.com/quote/'+stock+'/key-statistics?p='+stock+'&.tsrc=fin=srch').read()
sourceCodeR = sourceCode.decode('utf-8')
PB = sourceCodeR.split('Price/book</span><!-- react-text: 61 --> <!-- /react-text --><!-- react-text: 62 -->(mrq)<!-- /react-text --><sup aria-label="" data-reactid="63"></sup></td><td class="Fz(s) Fw(500) Ta(end) Pstart(10px) Miw(60px)" data-reactid="64">')[1].split('</td>')[0]
PE = sourceCodeR.split('Trailing P/E</span><!-- react-text: 31 --> <!-- /react-text --><!-- react-text: 32 --><!-- /react-text --><sup aria-label="" data-reactid="33"></sup></td><td class="Fz(s) Fw(500) Ta(end) Pstart(10px) Miw(60px)" data-reactid="34">')[1].split('</td>')[0]
print ('____________________________________')
print (stock)
print ('P/B',PB)
print ('PE',PE)
except:
print ("NA")
for eachStock in bsebanks:
yahooKeyStats(eachStock)
但是,当我尝试添加另一个指标时,比如支出比率,如下所示:
po = sourceCodeR.split('Payout Ratio</span><!-- react-text: 298 --> <!-- /react-text --><!-- react-text: 299 --><!-- /react-text --><sup aria-label="Data provided by Morningstar, Inc." data-reactid="300">4</sup></td><td class="Fz(s) Fw(500) Ta(end) Pstart(10px) Miw(60px)" data-reactid="301">')[1].split('</td>')[0]
print ('PO',po)
它似乎不起作用并且returns NA。
我哪里错了?请帮忙
PS:没学过python。我正在尝试为我的研究构建一个股票筛选器。
对您的代码进行了一些更改。您应该使用 html 解析器来完成这样的工作。
在这里,我使用 Beautiful Soup 以干净的方式解决您的问题。
要求:pip install beautifulsoup4
from urllib.request import urlopen
from bs4 import BeautifulSoup
def yahooKeyStats(name):
url = 'https://in.finance.yahoo.com/quote/{}/key-statistics'.format(name)
page = urlopen(url).read()
soup = BeautifulSoup(page, 'lxml')
pe = soup.find('span', text='Trailing P/E').find_next('td').get_text()
pb = soup.find('span', text='Price/book').find_next('td').get_text()
payout = soup.find('span', text='Payout ratio').find_next('td').get_text()
print("symbol: {}\ntrailing p/e: {}\np/b: {}\npayout: {}\n".format(name, pe, pb, payout))
bsebanks = ['HDFCBANK.BO', 'ICICIBANK.BO', 'SBIN.BO']
for eachStock in bsebanks:
yahooKeyStats(eachStock)
输出:
>> symbol: HDFCBANK.BO
>> trailing p/e: 28.37
>> p/b: 4.32
>> payout: 17.02%
>>
>> symbol: ICICIBANK.BO
>> trailing p/e: 50.00
>> p/b: 2.82
>> payout: 9.78%
>>
>> symbol: SBIN.BO
>> trailing p/e: 24.62
>> p/b: 1.26
>> payout: 0.00%