我使用下面的代码来保存名称中带有时间戳的html文件:
import contextlib
import datetime
import urllib2
import lxml.html
import os
import os.path
timestamp=''
filename=''
for dirs, subdirs, files in os.walk("/home/test/Desktop/"):
for f in files:
if "_timestampedfile.html" in f.lower():
timestamp=f.split('_')[0]
filename=f
break
if timestamp is '':
timestamp=datetime.datetime.now()
with contextlib.closing(urllib2.urlopen(urllib2.Request(
"http://www.google.com",
headers={"If-Modified-Since": timestamp}))) as u:
if u.getcode() != 304:
myfile="/home/test/Desktop/"+str(datetime.datetime.now())+"_timestampedfile.html"
file(myfile, "w").write(urllib2.urlopen("http://www.google.com").read())
if os.path.isfile("/home/test/Desktop/"+filename):
os.remove("/home/test/Desktop/"+filename)
html = lxml.html.parse(myfile)
else:
html = lxml.html.parse("/home/test/Desktop/"+timestamp+"_timestampedfile.html")
links=html.xpath("//a/@href")
print u.getcode()
每次从If-Modified-since标头获取代码200时运行此代码。我在哪里做错了?我的目标是保存和使用html文件,如果在上次访问后修改它,则应覆盖html文件。
答案 0 :(得分:7)
问题是If-Modified-Since
是supposed to be个formatted日期字符串:
If-Modified-Since: Sat, 29 Oct 1994 19:43:31 GMT
但你传递的是日期时间元组。
尝试这样的事情:
timestamp = time.time()
...
time.strftime('%a, %d %b %Y %H:%M:%S GMT', time.gmtime(timestamp))
您的代码无法正常工作的第二个原因:
http://www.google.com/似乎不尊重If-modified-since
。这是RFC允许的,他们可能有各种理由选择这种行为。
c) If the variant has not been modified since a valid If- Modified-Since date, the server SHOULD return a 304 (Not Modified) response.
例如,如果你尝试http://www.stackoverflow.com/,你会看到一个304.(我刚试过它。)