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

如何用关键词‘Green hydrogen’抓取CNBC新闻?代码空输出解决方法

解决CNBC搜索页动态内容抓取空输出的问题

你的代码返回空输出,核心原因是CNBC的搜索结果是通过JavaScript动态渲染的:requests.get只能获取页面的初始静态HTML,此时目标元素<span class="Card-title">还未被加载,所以BeautifulSoup找不到任何匹配的元素。

下面提供两种可行的解决方法:

方法一:用Selenium模拟浏览器渲染动态内容

Selenium可以模拟真实浏览器加载页面,等待JavaScript执行完成后再抓取内容,步骤如下:

  1. 先安装依赖:
pip install selenium beautifulsoup4
  1. 下载对应浏览器的驱动(比如ChromeDriver,需和你的Chrome版本匹配),确保驱动路径能被Python找到。

  2. 替换后的代码:

from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By

cnbc_url = "https://www.cnbc.com/search/?query=green%20hydrogen&qsearchterm=green%20hydrogen"

# 配置Chrome无头模式(可选,不弹出浏览器窗口)
chrome_options = Options()
chrome_options.add_argument("--headless=new")

# 启动浏览器并加载页面
driver = webdriver.Chrome(options=chrome_options)
driver.get(cnbc_url)

# 等待目标元素加载完成(最多等待10秒)
try:
    WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.CLASS_NAME, "Card-title"))
    )
    # 获取渲染后的完整页面源码
    page_source = driver.page_source
    bsobj = BeautifulSoup(page_source, 'html.parser')
    
    # 提取并打印标题
    for title_span in bsobj.find_all('span', class_='Card-title'):
        print('Headlines : {}'.format(title_span.text.strip()))
finally:
    driver.quit()  # 关闭浏览器

方法二:直接请求后台API接口(更高效)

动态加载的内容通常来自后台API,你可以通过浏览器开发者工具抓包找到对应的接口,直接请求接口获取数据,无需渲染页面:

  1. 打开浏览器的开发者工具(F12),切换到「网络」标签页,刷新CNBC搜索页,找到返回搜索结果的API请求(通常是XHR或Fetch类型)。
  2. 复制该API的URL,直接用requests请求并解析返回的JSON/XML数据。

示例代码(假设找到的API接口如下,实际需以抓包结果为准):

import requests

# 替换为你抓包得到的真实API地址
api_url = "https://search.cnbc.com/rs/search/combinedcms/view.xml?query=green%20hydrogen&qsearchterm=green%20hydrogen&sort=date&size=10"

response = requests.get(api_url)
# 解析XML格式的响应(如果是JSON则用response.json())
from bs4 import BeautifulSoup
bsobj = BeautifulSoup(response.content, 'xml')

# 提取标题(根据API返回的结构调整)
for item in bsobj.find_all('item'):
    print('Headlines : {}'.format(item.title.text.strip()))

注意事项

  • Selenium的浏览器驱动需和浏览器版本匹配,否则会报错;
  • 网站的API接口可能会随时调整,若接口失效需重新抓包获取最新地址;
  • 频繁请求可能触发网站反爬机制,建议添加请求间隔或设置请求头模拟浏览器。

内容的提问来源于stack exchange,提问作者Hitesh Prajapati

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 19:15:55