You need to enable JavaScript to run this app. Python3.6配合twill从jspx站点下载PDF打开空白如何解决
优惠活动
大模型
产品
解决方案
定价
更多

Python3.6配合twill从jspx站点下载PDF打开空白如何解决

解决方案

你遇到的问题核心是twill默认的save_html、redirect_output方法都是为文本类HTML响应设计的,会自动把二进制的PDF内容按字符串编码处理,破坏了原始二进制流,所以保存的文件大小接近但内容损坏,出现全空白的情况。

方案1:直接从twill3实例提取二进制PDF保存(推荐)

twill 3版本可以通过get_twill_state()获取浏览器实例,直接读取原始响应的二进制内容,不需要修改原有逻辑,代码如下:

#!/usr/bin/python3
from twill.commands import *
from twill import get_twill_state

# 原有登录、提交表单逻辑不变
go('http://example.com/Login.jspx')
fv('1', 'j_username', 'user')
fv('1', 'j_password', 'pass')
submit('0')

# PDF跳转逻辑不变
fv('1', 'source', 'mainTempl:_id40')
submit('1')
fv('1', 'source', 'mainTempl:bill:_id224:0:_id140')
submit('0')

# 新增保存PDF逻辑
browser = get_twill_state().browser
# 直接取原始二进制响应内容
pdf_bytes = browser.response.content
# 二进制写入保存
with open('Bill.pdf', 'wb') as f:
    f.write(pdf_bytes)

这个方案不需要引入额外依赖,直接用twill本身的能力就能解决,不会出现编码转换导致的内容损坏问题。

方案2:导出cookie给requests使用

如果你需要用requests单独处理下载逻辑,也可以从twill实例导出cookie,对应代码如下:

import requests
from twill import get_twill_state

browser = get_twill_state().browser
# 导出cookiejar,可直接传给requests使用
cookies = browser._session.cookies
# 如果需要转成字典格式也可以
cookie_dict = requests.utils.dict_from_cookiejar(cookies)

# 后续用requests请求PDF地址时带上cookie即可
# resp = requests.get('你的PDF下载地址', cookies=cookies)
# with open('Bill.pdf', 'wb') as f:
#     f.write(resp.content)

注意事项

  • 不要使用save_html、redirect_output处理PDF、图片等二进制文件,这两个方法会强制按文本格式处理内容,必然导致二进制数据损坏。
  • 不需要手动修改twill内置方法的写入模式,直接读取原始响应内容是最稳妥的方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.19 02:06:06