无法准确分割

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%