2013-07-24 3 views
1

Я использую ниже код для сохранения HTML-файла с отметкой времени в его названии:заголовка If-Modified-Since не дает 304 кода

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() 

Когда я запускаю этот код каждый раз, когда я получаю код 200 из заголовка If-Modified-since. Где я ошибаюсь? Моя цель здесь - сохранить и использовать html-файл, и если он будет изменен после последнего обращения к нему, файл html должен быть перезаписан.

ответ

5

Проблема заключается в том, что If-Modified-Since является supposed to beformatted строка даты:

If-Modified-Since: Sat, 29 Oct 1994 19:43:31 GMT 

но вы передаете в Задан кортеже.

http://www.google.com/, кажется, не чтить If-modified-since:

попробовать что-то вроде этого:

timestamp = time.time() 
... 
time.strftime('%a, %d %b %Y %H:%M:%S GMT', time.gmtime(timestamp)) 

Вторая причина ваш код не работает, как вы ожидаете. Это разрешено для 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. (я просто попробовал.)

+0

Теперь я использую datetime.datetime.now(). CTIME (), который дает мне время в этом формате Wed Jul 24 16:16:19 2013, все еще не работает. Есть ли способ получить время в предложенном формате. – user2460869

+0

Это ['ctime' output] также не является правильным. Он должен быть отформатирован точно так же, как «Sat, 29 Oct 1994 19:43:31 GMT». Я обновил свой ответ, чтобы включить некоторый пример кода, который генерирует соответствующее значение. Надеюсь, это поможет! –

+0

Все еще не работает, теперь я даю время в этом формате Wed, 24 Jul 2013 23:37:11 GMT – user2460869

Смежные вопросы