Saving a Web Page Into A Single File

本文介绍了一种简便的方法,可以将包含图片和文本的整个网页保存为单一的MHT文件,避免了使用IE浏览器时常见的SaveAs对话框。通过提供的代码示例,读者可以轻松实现这一功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

你是否曾经想过要把一个包含图片和文本的网页保存到单个的文件里?你可以使用IE的 saveAs 功能,但是缺点很明显,这个Saveas 对话框总是出于安全考虑而被show up.有重复杂的做法,可以避开 SaveAs 对话框。下面我给大家示范如何操作:

Do you ever want to save a web page into one single file, including pictures and text? You can use IE SaveAs command, but the drawback is obvious, the Save As dialog is always shown up for security reason. There is a complicated work around to avoid the Save As dialog (see Automated IE SaveAs MHTML). Here I show you an easy way to do it:  

#import "c:/program files/common files/system/ado/msado15.dll" _
        no_namespace rename("EOF", "EndOfFile")
#import 
  no_namespace rename("EOF", "EndOfFile")

...

void SaveWholePage(LPCTSTR page_url,LPCTSTR save_filename)
{
   CoInitialize(NULL);
   {
      IMessagePtr       iMsg(__uuidof(Message));
      IConfigurationPtr iConf(__uuidof(Configuration));
      iMsg->Configuration = iConf;
      try
      {
         iMsg->CreateMHTMLBody(
            page_url,
            cdoSuppressNone,
            "domain//username",
            "password");
      }
      catch(_com_error err)
      {
         // handle exception
      }
      _StreamPtr pStream=iMsg->GetStream();
      pStream->SaveToFile( save_filename,
                           adSaveCreateOverWrite);
   }
   CoUninitialize();
}
简单的用法:
SaveWholePage("http://www.zaobao.com/gj/zg002_050203.html",
              "test.mht");

我们不提供例子程序,你可以把这段代码复制粘贴到你自己创建的程序中去。

Sample program is not provided, since you can create it on your own and copy & paste the above code snippet into your project.

### 解决方案分析 当遇到 `File is not a zip file` 错误时,通常表明生成的文件不符合 Excel 的标准格式。Excel 文件通常是基于 ZIP 压缩的 `.xlsx` 文件,内部包含多个 XML 文档和其他资源文件。如果这些文件未被正确压缩或某些部分缺失,则可能会触发此错误。 #### 可能的原因 1. **XML 格式不正确**:Excel 对其内部使用的 XML 文件有严格的要求。任何标签、属性或数据格式上的错误都可能导致无法打开文档[^1]。 2. **文件损坏**:在保存过程中可能发生了意外中断,导致最终生成的文件不是有效的 ZIP 文件。 3. **内存或磁盘空间不足**:类似于数据库中的表满错误(ERROR 1114),也可能是因为存储空间不足而未能成功创建完整的文件[^2]。 4. **多线程问题**:如果使用了并发或多线程处理来写入 Excel 文件,在任务完成前终止某个线程可能会导致数据丢失或文件结构破坏[^3]。 #### 推荐解决方案 以下是几种可以尝试的方法: #### 方法一:验证并修复 XML 和 ZIP 结构 确保用于构建 Excel 表格的数据完全符合 Microsoft Office Open XML 标准。可以通过以下方式实现: - 使用成熟的库如 Python 中的 `openpyxl` 或 Java 中的 Apache POI 来代替手动编写 XML。 - 如果必须自定义 XML 输出,请仔细检查每一段代码以确认无拼写错误或其他语法问题。 ```python from openpyxl import Workbook wb = Workbook() ws = wb.active ws.title = "Sample Sheet" ws['A1'] = "Hello World" try: wb.save("sample.xlsx") # 尝试保存到本地路径 except Exception as e: print(f"Error occurred while saving workbook: {e}") ``` 上述脚本利用 `openpyxl` 库简化了复杂的手动编码过程,并减少了潜在的人为失误风险。 #### 方法二:优化数据传输性能 对于大数据量场景下频繁发生的此类错误,考虑减少序列化/反序列化的开销以及提高 I/O 效率尤为重要。具体措施包括但不限于采用高效的数据压缩算法降低实际拷贝大小[^4]: ```python import pandas as pd import io import zipfile df = pd.DataFrame({ 'Column1': range(10), 'Column2': ['Test']*10, }) buffer = io.BytesIO() with zipfile.ZipFile(buffer, mode='w', compression=zipfile.ZIP_DEFLATED) as zf: df.to_excel(zf.open('data.xlsx', 'w'), index=False) # Save compressed bytes to disk or send over network. with open('compressed_data.zip', 'wb') as f_out: f_out.write(buffer.getvalue()) ``` 通过引入缓冲区对象配合内置模块 `io`, 并设置适当级别的压缩选项 (`ZIP_DEFLATED`) ,能够有效缓解因体积过大引起的失败情况。 #### 方法三:调整程序逻辑防止过早退出 针对涉及异步操作或者依赖外部服务调用的应用环境来说,务必保证所有必要的子流程均已平稳结束后再继续下一步动作;否则很容易因为某环节提前崩溃而导致整体状态紊乱从而引发异常行为。例如可以在主线等待直到辅助工作者全部汇报完毕之后再关闭连接等资源释放活动. --- ### 总结 综上所述,“File is not a zip file”的根本原因往往源于目标档案本身存在问题——无论是由于原始资料准备阶段就存在缺陷还是后续加工环节出了纰漏所致皆有可能。因此建议优先选用经过良好测试验证过的第三方工具包来进行相关作业的同时也要注意监控整个生命周期内的各个环节表现状况以便及时发现问题所在加以修正改进。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值