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
相关产品推荐
相关产品推荐

