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

从NOAA指定网页批量下载.nc文件 现有BeautifulSoup代码返回空如何修复

问题修复方案

你的代码出现空返回主要有三个问题:

  1. BeautifulSoup.find_all()用法错误:直接传入.nc字符串没有匹配规则,该方法不能直接通过文件后缀筛选内容,需要先定位页面所有链接标签<a>,再筛选href属性以.nc结尾的链接。
  2. URL拼接存在多余斜杠:base_url末尾和拼接时重复添加了斜杠,虽然目标站点兼容该格式,但属于不规范写法,容易触发404错误。
  3. 缺少相对路径转绝对路径逻辑:页面内的nc文件链接都是相对路径,需要和基础URL拼接才能得到可直接使用的下载地址。

修复后完整代码

import urllib3
from bs4 import BeautifulSoup
import os

# 按需关闭urllib3警告,不需要可删除
urllib3.disable_warnings()

site = urllib3.PoolManager()
base_url = 'https://www.ncei.noaa.gov/data/avhrr-land-normalized-difference-vegetation-index/access/'
year = '2000'
# 规范拼接请求地址
request_url = base_url + year + '/'

# 先判断请求是否成功
response = site.request('GET', request_url)
if response.status != 200:
    print(f"请求失败,状态码:{response.status}")
    exit()

soup = BeautifulSoup(response.data, "lxml")
list_urls = []
# 筛选所有nc文件的完整链接
for a_tag in soup.find_all('a', href=True):
    if a_tag['href'].endswith('.nc'):
        full_nc_url = request_url + a_tag['href']
        list_urls.append(full_nc_url)

# 测试输出获取到的链接
print(f"共获取到{len(list_urls)}个nc文件链接")
for url in list_urls[:5]:
    print(url)

可选:添加批量下载逻辑

获取到链接后如果要直接下载文件,可以追加以下代码:

save_dir = './nc_files'
os.makedirs(save_dir, exist_ok=True)

for idx, nc_url in enumerate(list_urls):
    file_name = nc_url.split('/')[-1]
    save_path = os.path.join(save_dir, file_name)
    print(f"正在下载第{idx+1}/{len(list_urls)}个文件:{file_name}")
    nc_resp = site.request('GET', nc_url)
    with open(save_path, 'wb') as f:
        f.write(nc_resp.data)
print("所有文件下载完成")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 16:39:04