Ограничение элементов RSS по дате с feedparser. [Python] - PullRequest
3 голосов
/ 05 февраля 2010

Я повторяю RSS-канал примерно так, где _file - канал

d = feedparser.parse(_file)
for element in d.entries: 
    print repr(element.date)

Вывод даты получается примерно так

u'Thu, 16 Jul 2009 15:18:22 EDT'

Кажется, я не понимаю, как на самом деле количественно оценить вышеприведенную дату, чтобы я мог использовать ее для ограничения элементов канала. Итак, я спрашиваю, как я могу извлечь из этого фактическое время, поэтому я могу сказать, что если ему больше 7 дней, пропустите этот элемент.

Ответы [ 3 ]

5 голосов
/ 05 февраля 2010

feedparser должен предоставить вам объект struct_time из временного модуля Python. Я предполагаю, что он не распознает этот формат даты и поэтому дает вам необработанную строку.

Смотрите здесь о том, как добавить поддержку разбора искаженных временных меток:

http://pythonhosted.org/feedparser/date-parsing.html

Если вам удастся получить его, чтобы дать вам struct_time, вы можете прочитать об этом здесь:

http://docs.python.org/library/time.html#time.struct_time

Объекты struct_time имеют все, что вам нужно. У них есть эти члены:

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)

Обычно я преобразую структуры в секунды, например:

import time
import calendar

struct = time.localtime()
seconds = calendar.timegm(struct)

Затем вы можете просто сделать обычную математику, чтобы увидеть, сколько секунд прошло, или использовать модуль datetime для выполнения timedeltas.

1 голос
/ 05 февраля 2010

в одну сторону

>>> 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"

вы также можете увидеть модуль datetime и использовать timedelta () для вычисления даты.

0 голосов
/ 05 февраля 2010

Если вы устанавливаете модуль dateutil :

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

Если вы используете Ubuntu, dateutil предоставляется пакетом python-dateutil.

...