Python:将包含大量图形的页面保存为.html文件

Python:将包含大量图形的页面保存为.html文件,python,python-2.7,beautifulsoup,urllib,urlopen,Python,Python 2.7,Beautifulsoup,Urllib,Urlopen,我想将访问过的页面保存为文件。我正在使用urllib和URLOpener。 我选择一个网站。该文件正确地保存为.html,但当我打开该文件时,我注意到顶部的主图片(其中包含指向其他子页面的书签)没有显示,并且还显示了一些其他元素(如POTD)。如何正确保存页面以将所有页面保存到磁盘上 def saveUrl(url): testfile = urllib.URLopener() testfile.retrieve(url,"file.html") ... save

我想将访问过的页面保存为文件。我正在使用urllib和URLOpener。 我选择一个网站。该文件正确地保存为.html,但当我打开该文件时,我注意到顶部的主图片(其中包含指向其他子页面的书签)没有显示,并且还显示了一些其他元素(如POTD)。如何正确保存页面以将所有页面保存到磁盘上

def saveUrl(url):
        testfile = urllib.URLopener()
        testfile.retrieve(url,"file.html")
...
saveUrl("http://emma-watson.net")
真实页面的屏幕: 我的磁盘上打开的文件的屏幕:

您要做的是创建一个非常简单的web scraper(也就是说,您希望找到文件中的所有链接并下载它们,但不希望以递归方式进行,也不希望进行任何奇特的过滤或后处理等)

您可以通过使用一个完整的web scraper库来实现这一点,例如,将其深度限制为1,而不启用任何其他功能

或者你可以手工做。选择您最喜欢的HTML解析器(
BeautifulSoup
易于使用;
HTML.parser
内置于stdlib中;有几十种其他选择)。下载页面,然后解析生成的文件,扫描其中的
img
a
script
,等等。使用URL标记,然后下载这些URL,就完成了

如果您希望将所有内容存储在一个文件中,那么存在多种“web存档文件”格式,不同的浏览器(和其他工具)支持不同的格式。其中大多数的基本思想是创建一个zipfile,其中包含一些特定布局的文件和一些扩展名,比如.webarch而不是.zip。那部分很简单。但是您还需要将所有绝对链接更改为相对链接,这有点困难。不过,使用
BeautifulSoup
html.parser
lxml
这样的工具并不难


顺便说一句,如果你实际上没有使用
UrlOpener
做任何事情,那你就是在无缘无故地让自己的生活更艰难;就用吧。此外,正如文档中提到的,您应该使用
urllib2
,而不是
urllib
;事实上,
urllib.urlopen
从2.6开始就被弃用了。而且,即使您确实需要使用显式opener,例如,“除非您需要支持使用http:、ftp:、或file:以外的方案打开对象,否则您可能需要使用
FancyUrOpener


下面是一个使用BeautifulSoup的简单示例(一旦您决定了自己到底想做什么和不想做什么,这足以让您开始学习):

import os
import urllib2
import urlparse
import bs4

def saveUrl(url):
    page = urllib2.urlopen(url).read()
    with open("file.html", "wb") as f:
        f.write(page)
    soup = bs4.BeautifulSoup(f)
    for img in soup('img'):
        imgurl = img['src']
        imgpath = urlparse.urlparse(imgurl).path
        imgpath = 'file.html_files/' + imgpath
        os.makedirs(os.path.dirname(imgpath))
        img = urllib2.urlopen(imgurl)
        with open(imgpath, "wb") as f:
            f.write(img)

saveUrl("http://emma-watson.net")

如果有任何带有相对链接的图像,此代码将不起作用。要处理这个问题,您需要调用以附加一个基本URL。而且,由于基本URL可以以各种不同的方式设置,如果您想处理任何人编写的每个页面,您需要阅读文档并编写适当的代码。在这一点上,您应该开始查看类似于
scrapy
的内容。但是,如果你只想处理一些网站,那么写一些适合这些网站的东西就可以了



同时,如果任何图像在页面加载时间后由JavaScript加载(这在现代网站上很常见),那么除了实际运行JavaScript代码之外,什么都不起作用。此时,您可能需要一个浏览器自动化工具(如Selenium)或浏览器模拟器工具(如Mechanize+PhantomJS),而不是刮刀。

您是想将所有内容保存在一个“web存档”文件中,还是只将所有其他文件与.html文件一起保存?另外,您使用
urllib
而不是
urllib2
有什么原因吗?或者您正在构建一个显式的
URLOpener
而不是调用
urlopen
,不做任何自定义操作?@abarnert我刚刚决定使用urllib。我也使用URLOpener,因为我读到它很好。我想把页面保存在磁盘上,这样就有可能打开它(保存的版本),如果我可以打开页面,将其保存为web archive或.html,对我来说没有什么区别it@Rop,Stackoverflow不是为了免费开发,而是为了帮助。只需调试“for img”循环。它可能会列出所有的图像URL。