Restringindo elementos RSS por data com feedparser. [Pitão]
-
18-09-2019 - |
Pergunta
Eu iterar um feed RSS como assim, onde _file é o feed
d = feedparser.parse(_file)
for element in d.entries:
print repr(element.date)
A saída data sai como assim
u'Thu, 16 Jul 2009 15:18:22 EDT'
Eu não consigo entender como realmente quantificar a saída de data acima para que eu possa usá-lo para limitar os elementos de alimentação. I Então o que eu estou pedindo é como posso obter um tempo real fora deste, para que eu possa dizer se maior do que 7 dias de idade, ignorar este elemento.
Solução
feedparser é suposto dar-lhe um objeto struct_time do módulo de tempo de Python. Eu estou supondo que não reconhece que o formato de data e por isso é dando-lhe a corda crua.
Veja aqui sobre como adicionar suporte para analisar timestamps malformados:
http://pythonhosted.org/feedparser/date-parsing.html
Se você conseguir obtê-lo para dar-lhe a struct_time, você pode ler mais sobre isso aqui:
http://docs.python.org/library/time.html # time.struct_time
objetos struct_time tem tudo que precisa. Eles têm esses membros:
time.struct_time(tm_year=2010, tm_mon=2, tm_mday=4, tm_hour=23, tm_min=44, tm_sec=19, tm_wday=3, tm_yday=35, tm_isdst=0)
Eu geralmente converter as estruturas de segundos, como este:
import time
import calendar
struct = time.localtime()
seconds = calendar.timegm(struct)
Depois, é só fazer matemática regular para ver quantos segundos se passaram, ou utilizar o módulo de data e hora para fazer timedeltas.
Outras dicas
uma maneira
>>> import time
>>> t=time.strptime("Thu, 16 Jul 2009 15:18:22 EDT","%a, %d %b %Y %H:%M:%S %Z")
>>> sevendays=86400*7
>>> current=time.strftime ("%s",time.localtime())
>>> if int(current) - time.mktime(t) > sevendays:
print "more than 7 days"
Você também pode ver a datetime módulo e fazer uso de timedelta () para cálculos de data.
Se você instalar o dateutil módulo:
import dateutil.parser as dp
import dateutil.tz as dtz
import datetime
date_string=u'Thu, 16 Jul 2009 15:18:22 EDT'
adatetime=dp.parse(date_string)
print(adatetime)
# 2009-07-16 15:18:22-04:00
now=datetime.datetime.now(dtz.tzlocal())
print(now)
# 2010-02-04 23:35:52.428766-05:00
aweekago=now-datetime.timedelta(days=7)
print(aweekago)
# 2010-01-28 23:35:52.428766-05:00
if adatetime<aweekago:
print('old news')
Se você estiver usando Ubuntu, dateutil
é fornecido pelo pacote python-dateutil
.