1

我正在使用 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() 只在我收到缓存后每天运行程序的第一天是正确的日期如果格式不正确,我提前道歉我对编程比较陌生。

4

1 回答 1

4

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

显然,您感到困惑的是您strftime('%a %b %w')在日期上使用,而今天看起来就像下周三的那种格式。正如文档解释的那样:

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

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


显然,您正在寻找一种方法来获取月份中的日期,而不是星期几,但没有前导 0。

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


如果你只想让它在你的机器上运行,而不是便携:CPython 实际实现的方式strftime是调用你平台的 C 函数,它可能确实有办法在没有前导 0 的情况下获得一天。

  • POSIX给出%e. 这意味着它适用于所有最新的 Unix(包括 Mac)和大多数类 Unix(包括 linux)——但不适用于 Windows。
  • glibc添加和 BSD 复制的标志字符来控制填充,因此您可以使用%_dor %-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,所以你可能想添加评论。

于 2013-07-10T18:24:15.980 回答