You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用BeautifulSoup抓取嵌套Div无输出无报错,求排查问题

问题排查:抓取雅虎财经HDFC.NS开盘价无输出无报错

我帮你梳理下代码没输出也没报错的原因,主要是两个核心问题:

1. 动态内容加载导致静态HTML里没有目标元素

你要抓取的stx-tooltip相关内容,是雅虎财经页面通过JavaScript动态渲染出来的。而requests.get只能获取页面的静态HTML源码,这部分源码里根本不存在你要找的那些div元素。所以soup.find_all('div', attrs={'class': 'stx-tooltip'})实际上返回的是空列表,代码根本没进入循环,自然不会有输出。

2. 代码逻辑的潜在隐患(虽未触发,但值得注意)

就算静态页面里有目标元素,你的代码也有小问题:如果foo.find('div', attrs={'id': 'Open'})没找到对应元素,bar会变成None,后续for check in bar会直接抛出异常。不过这次因为前面就没找到元素,所以没触发这个错误。


解决方案

给你两个可行的解决思路,其中第二个更推荐:

方案1:用Selenium模拟浏览器抓取动态内容

Selenium会模拟真实浏览器加载页面,等待JavaScript执行完成后再获取完整的DOM结构,这样就能拿到你要的元素了。示例代码如下:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time

def ParsePrice():
    total_calls_a_day = 1
    while total_calls_a_day < 3:
        total_calls_a_day += 1
        # 初始化Chrome浏览器(需提前下载对应版本的chromedriver)
        driver = webdriver.Chrome()
        try:
            company = 'https://in.finance.yahoo.com/quote/HDFC.NS/chart?p=HDFC.NS'
            driver.get(company)
            # 等待目标tooltip元素加载完成,最多等待10秒
            WebDriverWait(driver, 10).until(
                EC.presence_of_element_located((By.CLASS_NAME, 'stx-tooltip'))
            )
            # 额外等待2秒确保所有动态内容渲染完毕
            time.sleep(2)
            # 逐层查找目标元素并提取值
            tooltip = driver.find_element(By.CLASS_NAME, 'stx-tooltip')
            open_section = tooltip.find_element(By.ID, 'Open')
            open_price = open_section.find_element(By.CLASS_NAME, 'stx-field-value').text
            print(f"今日开盘价: {open_price}")
        finally:
            # 无论成功失败都关闭浏览器
            driver.quit()

if __name__ == '__main__':
    ParsePrice()

注意:需要先安装selenium(pip install selenium),并下载对应浏览器的驱动(比如Chrome的chromedriver),将其放到环境变量可访问的路径中。

方案2:直接使用雅虎财经API(更稳定可靠)

网页抓取容易受页面结构变动影响,直接用官方API或者现成的第三方库会更靠谱。比如yfinance库,专门用于获取雅虎财经的股票数据,代码简洁且稳定:

import yfinance as yf

def ParsePrice():
    total_calls_a_day = 1
    while total_calls_a_day < 3:
        total_calls_a_day += 1
        # 获取HDFC.NS的股票数据对象
        hdfc_stock = yf.Ticker("HDFC.NS")
        # 提取当日开盘价(可根据需求获取其他字段,比如收盘价、成交量等)
        open_price = hdfc_stock.info['open']
        print(f"今日开盘价: {open_price}")

if __name__ == '__main__':
    ParsePrice()

安装命令:pip install yfinance,这个方法不需要关心页面结构,直接获取结构化数据,后续维护成本低很多。

内容的提问来源于stack exchange,提问作者Mahim Dhungel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 13:12:46