从缓存中访问html文件

时间:2013-07-24 01:10:19

标签: python

我在python中编写一个代码,它执行以下操作: 1)从互联网上获取一个html文件。 2)提取其网址。 3)将这些网址与搜索关键字进行比较,并打开用户想要打开的正确网页。 我使用以下代码:

def open_page(name):

    try:
        links = lxml.html.parse('http://www.w3schools.com/html/').xpath("//a/@href")
        for url in links:
            if re.search(name, url):
                self.get_webpage.open('http://www.w3schools.com/html/'+url)
                break
    except IndexError as e:
        pass`

我必须在我的模块中多次调用此方法,这使得打开网页的过程非常缓慢。我试图检查这个方法的每一行的执行时间,并开始知道lxml.html.parse()大部分时间都在消耗。此外,如果我尝试使用存储在本地系统中的某些html文件,此方法可以快速运行。有没有什么办法可以在第一次之后从缓存中获取此网页http://www.w3schools.com/html/的html文件? 附:我不想在我的本地系统中永久保存这个html文件,因为在这种情况下我可能会错过这个html文件的更新/更改。

2 个答案:

答案 0 :(得分:1)

听起来你确实想要缓存页面,但你也想检查自上次下载以来没有任何变化。

If-Modified-Since HTTP标头是您努力的朋友。在发出HTTP GET请求时,您可以在上次下载页面时提供该标题字段。如果从那时起服务器上的页面没有更改,服务器将返回304 Not Modified状态代码,不会发送页面内容,从而省去了再次下载的麻烦。

以下是在Python 2中执行此操作的方法:

import contextlib
import datetime
import urllib2

with contextlib.closing(urllib2.urlopen(urllib2.Request(
        "http://www.w3schools.com/html/",
        headers={"If-Modified-Since": last_access_time}))) as u:
    if u.getcode() != 304:
        cached_html = lxml.html.parse(u)
        last_access_time = datetime.datetime.now()
html = cached_html

last_access_timecached_html可能存储在磁盘上。

答案 1 :(得分:0)

您可以将htmls与时间戳一起存储,只有在html太旧时才下载html。