使用feedparser按日期限制RSS元素。[Python]

3 投票
3 回答
1838 浏览
提问于 2025-04-15 18:55

我这样遍历一个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 个回答

0

如果你安装了 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 这个软件包提供的。

1

一种方法

>>> 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() 来进行日期计算。

5

feedparser 是一个可以从 Python 的时间模块中获取 struct_time 对象的工具。不过,我猜它可能不认识你提供的日期格式,所以直接给了你原始的字符串。

你可以查看这里,了解如何支持解析格式不正确的时间戳:

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 模块来处理时间差。

撰写回答