以编程方式将网页保存到静态HTML文件的最佳方法

时间:2012-12-19 23:04:05

标签: python html css html-parsing

我做的研究越多,前景就越严峻。

我正在尝试使用Python保存平面保存或静态保存网页。这意味着将所有样式合并到内联属性,并将所有链接更改为绝对URL。

我已经尝试了几乎每个免费的转换网站,api,甚至是github上的库。没有那么令人印象深刻我可以找到的用于展平样式的最佳python实现是https://github.com/davecranwell/inline-styler。我为Flask稍微调整了一下,但生成的文件并不是很好。这是它的外观:

enter image description here

显然,它应该看起来更好。这是它应该是什么样子:

https://dzwonsemrish7.cloudfront.net/items/3U302I3Y1H0J1h1Z0t1V/Screen%20Shot%202012-12-19%20at%205.51.44%20PM.png?v=2d0e3d26

这似乎是一场无休止的斗争,处理格式错误的HTML,无法识别的CSS属性,Unicode错误等等。那么有没有人建议更好的方法来做到这一点?我知道我可以去档案 - >保存在我的本地浏览器中,但当我尝试这样做时,并提取一个不太可行的特定xpath。

看起来Evernote的网络剪辑器使用的是iFrame,但这看起来比我想象的要复杂得多。但至少在Evernote上剪报看起来不错。

2 个答案:

答案 0 :(得分:2)

听起来内联样式对你来说可能是一个交易破坏者,但如果没有,我建议再看看Evernote Web Clipper。桌面应用程序具有用于Web剪辑的导出HTML功能。输出有点乱,正如你期望的内联样式,但我发现标记是保存页面的可靠表示。

关于内联样式和外部样式,对于类似这样的事情,如果你从不同的网站做很多页面,那么我就没有看到任何内联方式,其中类名会有相互冲突的样式规则。

您提到Web Clipper使用iFrame,但我没有发现这是HTML输出的情况。如果您在另一个网站上重新发布(我认为合法地),您可能不得不将静态页面嵌入到iFrame中,否则这不应该是一个问题。

某些自动化肯定会有所帮助,因此您可以直接从浏览器转到HTML输出,也许可以将保存的图像重新定位到HTML中更新的src链接的单个仓库中。如果你最终在做这样的事情,我将很高兴自己尝试一下。

答案 1 :(得分:2)

离开一段时间后,我设法安装了一个ruby库,比我用过的任何东西都要好得多。这是非常慢的网络界面背后的库http://premailer.dialect.ca/

谢天谢地,他们在Github上发布了源代码,这是最好的。 https://github.com/alexdunae/premailer

它可以展平样式,创建绝对URL,使用URL或字符串,甚至可以创建纯文本电子邮件模板。这个图书馆印象非常深刻。

2013年11月更新

我最终编写了自己的书签,纯粹是客户端。它仅与Webkit和FireFox兼容。它通过每个节点递归并添加内联样式,然后将展平的HTML发送到clippy.in API以保存到用户的仪表板。

Client Side Bookmarklet