使用BeautifulSoup抓取嵌套Div无输出无报错,求排查问题
我帮你梳理下代码没输出也没报错的原因,主要是两个核心问题:
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

