【问题标题】:How to scrape within an html table?如何在 html 表中抓取?
【发布时间】:2020-04-01 00:54:00
【问题描述】:

我想从 yahoo Finance 中获取文本数据。对于任何代码,我希望能够获取总收入:

对于前面的示例,请参见欧莱雅页面。相关的目标代码是:

                         <div class="rw-expnded" data-reactid="44" data-test="fin-row">
                            <div class="D(tbr) fi-row Bgc($hoverBgColor):h" data-reactid="45">
                               <div class="D(tbc) Ta(start) Pend(15px)--mv2 Pend(10px) Bxz(bb) Py(8px) Bdends(s) Bdbs(s) Bdstarts(s) Bdstartw(1px) Bdbw(1px) Bdendw(1px) Bdc($seperatorColor) Pos(st) Start(0) Bgc($lv2BgColor) fi-row:h_Bgc($hoverBgColor) Pstart(15px)--mv2 Pstart(10px)" data-reactid="46">
                                  <div class="D(ib) Va(m) Ell Mt(-3px) W(215px)--mv2 W(200px)" data-reactid="47" title="Total Revenue"><span class="Va(m)" data-reactid="48">Total Revenue</span></div>
                                  <div class="W(3px) Pos(a) Start(100%) T(0) H(100%) Bg($pfColumnFakeShadowGradient) Pe(n) Pend(5px)" data-reactid="49"></div>
                               </div>
                               <div class="D(tbc) Ta(c) Pstart(6px) Pend(4px) Bxz(bb) Py(8px) BdB Bdc($seperatorColor) Miw(100px) Miw(156px)--pnclg Bgc($lv1BgColor) fi-row:h_Bgc($hoverBgColor)" data-reactid="50" data-test="fin-col"><span data-reactid="51">29,873,600</span></div>
                               <div class="D(tbc) Ta(c) Pstart(6px) Pend(4px) Bxz(bb) Py(8px) BdB Bdc($seperatorColor) Miw(100px) Miw(156px)--pnclg" data-reactid="52" data-test="fin-col"><span data-reactid="53">29,873,600</span></div>
                               <div class="D(tbc) Ta(c) Pstart(6px) Pend(4px) Bxz(bb) Py(8px) BdB Bdc($seperatorColor) Miw(100px) Miw(156px)--pnclg Bgc($lv1BgColor) fi-row:h_Bgc($hoverBgColor)" data-reactid="54" data-test="fin-col"><span data-reactid="55">26,937,400</span></div>
                               <div class="D(tbc) Ta(c) Pstart(6px) Pend(4px) Bxz(bb) Py(8px) BdB Bdc($seperatorColor) Miw(100px) Miw(156px)--pnclg" data-reactid="56" data-test="fin-col"><span data-reactid="57">26,023,700</span></div>
                               <div class="D(tbc) Ta(c) Pstart(6px) Pend(4px) Bxz(bb) Py(8px) BdB Bdc($seperatorColor) Miw(100px) Miw(156px)--pnclg Pend(10px) Bgc($lv1BgColor) fi-row:h_Bgc($hoverBgColor)" data-reactid="58" data-test="fin-col"><span data-reactid="59">25,837,100</span></div>
                            </div>
                            <div class="D(b)" data-reactid="60"></div>
                         </div>

为了尝试获得总收入,我这样做了:

#This will not run on online IDE 
import requests 
from bs4 import BeautifulSoup 

ticker = 'OR.SA'
URL = "https://finance.yahoo.com/quote/OR.PA/financials?p={ticker}"
r = requests.get(URL) 

soup = BeautifulSoup(r.content, 'html5lib') 

然后我尝试获取总收入之后的项目:

soup.find('span', string='Total Revenue').find_next().text

但它返回''

如果有更简单的方法,例如是否存在用于此的 API,请随时告诉我。我尝试了 yfinance,但它不适用于非美国股票的财务报表。

【问题讨论】:

  • 你试过yahooquery吗?安装后,使用以下命令获取总收入(以及所有损益表项目):Ticker('OR.PA').income_statement()

标签: python-3.x html-table beautifulsoup yahoo-finance


【解决方案1】:

您将获得下一个div。你必须得到下一个spanfind_next 将标签的名称作为参数。

使用这个:

soup.find('span', string='Total Revenue').find_next('span').text

代码

import requests
from bs4 import BeautifulSoup

ticker = 'OR.SA'
URL = "https://finance.yahoo.com/quote/OR.PA/financials?p={ticker}"
r = requests.get(URL)

soup = BeautifulSoup(r.content, 'html5lib')
# soup.find('span', string='Total Revenue').find_next()
# <div class="W(3px) ...data-reactid="49"></div>
print(soup.find('span', string='Total Revenue').find_next('span').text)

输出

29,873,600

【讨论】:

    【解决方案2】:

    您没有指定正确的标签来查找 next 。

    #This will not run on online IDE 
    import requests 
    from bs4 import BeautifulSoup 
    
    ticker = 'OR.SA'
    URL = "https://finance.yahoo.com/quote/OR.PA/financials?p={ticker}"
    r = requests.get(URL) 
    
    soup = BeautifulSoup(r.content, 'lxml')
    
    total_rev_tag = soup.find('div', {'title':"Total Revenue"}).parent.next_sibling
    total_rev_txt_1 = total_rev_tag.find('span').text
    total_rev_txt_2 = total_rev_tag.find_next().text
    print('total_rev_txt_1',total_rev_txt_1)
    print('total_rev_txt_2',total_rev_txt_2)
    
    total_rev_txt_3 = soup.find('span', string='Total Revenue').find_next('span').text
    print('total_rev_txt_3',total_rev_txt_3)
    

    输出:

    total_rev_txt_1 29,873,600
    total_rev_txt_2 29,873,600
    total_rev_txt_3 29,873,600
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-02-04
      • 1970-01-01
      • 2011-01-22
      • 2023-03-25
      • 2018-02-04
      • 1970-01-01
      • 2015-06-11
      • 1970-01-01
      相关资源
      最近更新 更多