soup.find定位存在的HTML路径返回None,雅虎财经ESG爬取问题求助
问题排查与解决方法
核心原因
- 反爬拦截:雅虎财经对未携带浏览器标识的请求会直接返回拦截页面,你打印的
succes只是代表请求没有报错,但返回的内容不是你在浏览器看到的正常可持续发展页面,自然找不到对应类名的div元素。 - 动态渲染:雅虎财经的ESG评分数据是通过JavaScript动态加载的,你直接请求拿到的原始静态HTML里不存在这个元素,只有当浏览器执行完JS渲染后才会生成对应节点,这就是你在开发者工具里能看到路径,但BeautifulSoup找不到的核心原因。
修复方案
方案1:添加请求头+找数据接口(推荐,性能最高)
首先给请求添加User-Agent伪装成浏览器,然后可以通过浏览器开发者工具的网络面板找到返回ESG数据的API接口,直接请求接口获取结构化的JSON数据,不需要解析HTML。
基础修改后的代码示例:
from bs4 import BeautifulSoup import requests # 加请求头伪装成普通浏览器请求 headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36' } try: resp = requests.get('https://finance.yahoo.com/quote/FB/sustainability?p=FB', headers=headers) resp.raise_for_status() # 请求状态码异常时会直接抛出错误,避免拿到无效页面 ESG_data = resp.text print('请求成功') except: print('Could not retrive') # 可以先打印ESG_data查看是否存在你要找的类名,不存在就说明是动态渲染,改用下面的方案2
方案2:使用模拟浏览器工具(适合新手,不需要找接口)
用Selenium这类工具启动真实浏览器,等页面加载完成后再提取元素:
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 driver = webdriver.Chrome() driver.get('https://finance.yahoo.com/quote/FB/sustainability?p=FB') # 最多等待10秒,直到目标元素加载完成 try: esg_element = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.CSS_SELECTOR, 'div.Fz\(36px\).Fw\(600\).D\(ib\).Mend\(5px\)')) ) print(esg_element.text) finally: driver.quit()
内容的提问来源于stack exchange,提问作者contemporaryspace
相关产品推荐
相关产品推荐

