为何使用以下Python代码无法下载PDF?触发ValueError错误
问题分析与解决
你触发的ValueError主要源于两个核心问题:
- 页面里PDF的链接是相对路径,直接传给
urlretrieve会导致URL解析失败; - 目标网站需要维持会话(比如访问页面时生成的Cookie),
urlretrieve是独立请求,没有携带会话信息,返回的非预期内容会引发错误。
修正后的代码
import requests from bs4 import BeautifulSoup from urllib.parse import urljoin # 初始化会话,自动维持Cookie session = requests.Session() base_url = 'https://www.go100.com.tw/exam_download_3.php' # 请求页面,让会话自动处理编码和Cookie response = session.get(base_url) soup = BeautifulSoup(response.text, 'html.parser') all_as = soup.find_all('a') for a_tag in all_as: # 先检查a标签是否包含href属性,避免KeyError href = a_tag.get('href') if href and 'pdf' in href: # 将相对路径转换为完整绝对URL full_pdf_url = urljoin(base_url, href) # 用会话请求PDF文件 pdf_response = session.get(full_pdf_url) # 验证请求是否成功 if pdf_response.status_code == 200: with open('file_tmp.pdf', 'wb') as f: f.write(pdf_response.content) print("PDF下载完成") break
关键改进点
- 用
requests.Session()维持会话,自动携带访问页面时的Cookie,避免网站拦截; - 借助
urljoin把相对URL转成完整绝对路径,解决URL解析错误; - 改用
requests.get下载PDF并写入文件,比urlretrieve更可控,还能通过状态码验证请求结果; - 增加
a_tag.get('href')的判断,避免因无href属性的a标签触发KeyError。
内容的提问来源于stack exchange,提问作者Tinny
相关产品推荐
相关产品推荐

