簡體   English   中英

無法使用 BeautifulSoup 刮取特定的“跨度” class

[英]Trouble scraping a specific 'span' class using BeautifulSoup

我正在從https://ca.finance.yahoo.com/quote/AAPL 抓取並希望獲得股票價格的變化,文本為綠色/紅色。 由於它們位於相同的“div”class 但不同的“span”class 中,因此我能夠獲取股價但不能獲取變化值。

我想要的文本:'-3.89 (-1.36%)' - 數字會有所不同

HTML 來自網站:

    <div class="My(6px) Pos(r) smartphone_Mt(6px)" data-reactid="29">
        <div class="D(ib) Va(m) Maw(65%) Ov(h)" data-reactid="30">
            <div class="D(ib) Mend(20px)" data-reactid="31"><span class="Trsdu(0.3s) Fw(b) 
             Fz(36px) Mb(-4px) D(ib)" data-reactid="32">282.80</span>
                   <span class="Trsdu(0.3s) Fw(500) Pstart(10px) Fz(24px) C($negativeColor)" 
                    data-reactid="33">-3.89 (-1.36%)</span>

我用來得到的價格:(282.80) - 價格可能會有所不同

stockLink = ('https://ca.finance.yahoo.com/quote/AAPL')
stockPage = requests.get(stockLink)
stockSoup = BeautifulSoup(stockPage.text, 'lxml')
stockQuote = stockSoup.find('div', {'class': 
                                       'My(6px)Pos(r)smartphone_Mt(6px)'}).find('span').text 
print(stockQuote)
                 

我嘗試了許多嘗試更改 class 名稱、跨度名稱和使用 data-reactid 但似乎都不起作用的變體,它們都是 output 一個空的“[]”。

非常感謝您。

看起來問題出在這一行

stockQuote = page_soup.find('div', {'class': 'My(6px)Pos(r)smartphone_Mt(6px)'}).find('span').text

class 名稱應該用空格分隔,因為它們在 html 中是不同的 class。

解決方案是將它們分開,如您在 HTML 頁面中看到的那樣。 它看起來像這樣(在 class 標識符中添加了兩個空格):

stockQuote = page_soup.find('div', {'class': 'My(6px) Pos(r) smartphone_Mt(6px)'}).find('span').text

但是,這將返回紅色/綠色文本之前的數字。 由於此 div 中有多個 span,因此您必須找到所有 span。 我是這樣做的:

stockQuote = page_soup.find('div', {'class': 'My(6px) Pos(r) smartphone_Mt(6px)'}).findAllNext('span')
stockQuote = stockQuote[1].text

findAllNext function 將在該 div 中找到跨度。 它返回大約 36,但您要查找的是第二個。 然后,您只需像以前一樣從中獲取文本,它應該返回您要查找的數字。

雖然 web 抓取是一個不錯的工具,但可能值得研究一下 yahoo 的yfinance API。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM