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

为何使用以下Python代码无法下载PDF?触发ValueError错误

问题分析与解决

你触发的ValueError主要源于两个核心问题:

  1. 页面里PDF的链接是相对路径,直接传给urlretrieve会导致URL解析失败;
  2. 目标网站需要维持会话(比如访问页面时生成的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 11:15:32