如何从目标网站筛选并下载特定的7份菜单PDF文件?
解决指定路径PDF下载问题
你的问题出在相对路径未转绝对URL:当你把判断条件改成检查"/dining/menus-and-hours/adc-menus/"时,这些链接的href可能是相对路径(比如/dining/menus-and-hours/adc-menus/monday.pdf),直接用requests.get(link.get('href'))会因为缺少域名导致请求失败。
下面是修复后的代码,同时帮你精准筛选目标PDF并优化命名:
from bs4 import BeautifulSoup import requests from urllib.parse import urljoin # 导入路径拼接工具 base_url = "https://calbaptist.edu" target_page = "https://calbaptist.edu/dining/alumni-dining-commons" # 获取页面内容 response = requests.get(target_page) soup = BeautifulSoup(response.text, 'html.parser') # 筛选符合条件的PDF链接 target_links = [] for link in soup.find_all('a'): href = link.get('href') # 同时满足:包含指定路径 + 是PDF文件 if href and "/dining/menus-and-hours/adc-menus/" in href and ".pdf" in href: # 把相对路径转成完整URL full_url = urljoin(base_url, href) target_links.append(full_url) # 下载筛选后的PDF for idx, pdf_url in enumerate(target_links, 1): print(f"正在下载第 {idx} 个文件: {pdf_url.split('/')[-1]}") # 发起请求 pdf_response = requests.get(pdf_url) # 用链接里的原文件名保存,避免序号命名不直观 file_name = pdf_url.split('/')[-1] with open(file_name, 'wb') as f: f.write(pdf_response.content) print(f"第 {idx} 个文件下载完成: {file_name}") print("所有目标PDF下载完成")
关键修改点说明:
- 用
urljoin将相对路径转为完整URL,确保请求有效 - 双重条件筛选:既匹配目标路径,又确认是PDF文件,避免无效链接
- 改用原文件名保存,方便区分每天的菜单(比如
monday.pdf) - 用
with open自动关闭文件,更安全规范
内容的提问来源于stack exchange,提问作者Rexdestoyer
相关产品推荐
相关产品推荐

