0

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

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 文件?ps 我不想将此 html 文件永久保存在本地系统中,因为在这种情况下,我可能会错过此 html 文件的更新/更改。

4

2 回答 2

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_time并且cached_html可能存储在磁盘上。

于 2013-07-24T01:36:03.950 回答
0

您可以将 html 与时间戳一起存储,并且仅在 html 太旧时才下载 html。

于 2013-07-24T01:16:49.623 回答