2013-07-24 41 views
0

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

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

+0

如果您没有将文件保存在磁盘上,那么缓存在哪里?即使大部分时间没有任何变化,您是否重复调用此函数的问题? – Taymon

+0

好吧,我很抱歉,我以错误的方式提出问题。你能告诉我如何使用兑现文件,而不是使用http://www.w3schools.com/html/里面lxml.html.parse() – user2460869

回答

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很可能存储在磁盘上。

+0

好的答案。但请注意,'last_access_time'作为'If-modified-since'的值发送时,必须采用RFC2616格式。例如,“星期六,1994年10月29日19时43分31秒”。 http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.25 –

0

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