从NOAA指定网页批量下载.nc文件 现有BeautifulSoup代码返回空如何修复
问题修复方案
你的代码出现空返回主要有三个问题:
BeautifulSoup.find_all()用法错误:直接传入.nc字符串没有匹配规则,该方法不能直接通过文件后缀筛选内容,需要先定位页面所有链接标签<a>,再筛选href属性以.nc结尾的链接。- URL拼接存在多余斜杠:base_url末尾和拼接时重复添加了斜杠,虽然目标站点兼容该格式,但属于不规范写法,容易触发404错误。
- 缺少相对路径转绝对路径逻辑:页面内的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
相关产品推荐
相关产品推荐

