每次运行此程序时调用datetime.now()

时间:2013-07-10 00:42:47

标签: python datetime

我正在使用beautifulsoup来搜索网站,我想将删除日期与通过datetime.date.today()调用收到的日期进行比较。

from BeautifulSoup import BeautifulSoup
import datetime, urllib2, re

opener = urllib2.build_opener()
opener.addheaders = [('User-agent', 'Mozilla/5.0')]
url = ('http://phoenix.backpage.com/SportsEquipForSale/')
myUrl = opener.open(url).read()
soup = BeautifulSoup(myUrl)
outfile = open('C:/Projects/Web Scraping Practice/datetime.txt', 'w')
date = soup.find("div", {"class" : "date"})        #scraped date
date = re.sub('[.]', '', date.contents[0]).strip() 
outfile.write(datetime.date.today().strftime('%a %b %w')+ '\n'+ date)

现在代码只是将当前日期(重新格式化)和已删除日期转储到文件中。 我遇到的问题是datetime.date.today()只被评估一次所以每次运行这个程序datetime.date.today()只有在我收到缓存后每天运行程序的第一天才正确日期 如果格式不好,我会提前道歉。我对编程比较新。

1 个答案:

答案 0 :(得分:4)

您的代码已经 每次运行时都会调用datetime.now()

显然你感到困惑的是你在约会时使用strftime('%a %b %w'),今天看起来就像下周三的那种格式。正如the docs解释:

  • %a是工作日的简短名称。
  • %b是短月名。
  • %w是工作日编号(星期日为0,星期六为6)。

所以,2013年7月10日是“7月3日星期三”,2013年7月17日也是“7月3日星期三”。


显然,您正在寻找一种方法来获取的日期,而不是的日子,但没有领先的0。

不幸的是,没有可移植的方法直接执行此操作。最初的C strftime没有它,所以这就是C89标准的内容,这就是Python复制的内容。


如果你只是希望在你的机器上运行,而不是便携:CPython实际实现strftime的方式就是调用平台的C函数,这可能 有一个如何获得没有领先0的一天。

  • POSIX给出%e。这意味着它适用于每个最新的Unix(包括Mac)和大多数类Unix(包括Linux),但不适用于Windows。
  • 添加了
  • glibc,并复制了BSD,标记字符以控制填充,因此您可以使用%_d%-d(取决于您是想要空格还是空白)。这意味着它适用于每个最新的BSD Unix(包括Mac)和每个基于glibc的系统(包括Linux) - 但同样不适用于Windows。
  • MSVCRT添加了不同的标记字符,因此您可以使用%#d。这意味着它适用于Windows(以及其他一些复制它的平台;我认为Symbian?) - 但不是其他任何东西。

当然,如果你使用的是Jython,IronPython或PyPy,它可能依赖于底层Java,.NET或Python运行时的某些功能,而不是C API。


如果您希望这是可移植的,则要么无法使用strftime,要么必须对其进行后期处理。

你已经在评论中找到了这个:

datetime.date.today().strftime('%a %b %d').replace(' 0', ' ')

除非某些语言环境中的月份名称可以以0开头(这似乎不太可能),否则这显然是安全有效的。但它有点hacky,所以你可能想添加评论。