1

对于 html 页面,尤其是与新闻相关的页面,如果有一种解析发布日期的机制,将会非常有帮助并且非常有用。

不幸的是,互联网上没有一套日期的正则表达式/模式。CNN 可能会像 MONTH DD、YYYY 一样发布它,而 HuffingtonPost 可能会像 MM/DD/YY 一样发布,等等。

有没有人有任何比纯正则表达式解析更好的策略来从 html 页面中提取发布日期?

谢谢你。

4

2 回答 2

5

尝试从dateutil库中解析函数。

它使用一些启发式方法来检测日期格式。它自动工作:)

>>> from dateutil.parser import parse

>>> parse('April 12, 2013')
datetime.datetime(2013, 4, 12, 0, 0)

>>> parse('04/12/13')
datetime.datetime(2013, 4, 12, 0, 0)

还有一个不错的 Python 小日期/时间库 — <a href="https://github.com/nvie/times/" rel="nofollow">times。它也在内部使用 dateutil,但它也有助于与时区一起正常工作。

>>> import times

>>> times.to_universal('2012-02-03 11:59:03', 'Europe/Amsterdam')
datetime.datetime(2012, 2, 3, 10, 59, 3)

>>> times.to_local(_, 'Europe/Amsterdam')
datetime.datetime(2012, 2, 3, 11, 59, 3, tzinfo=<DstTzInfo 'Europe/Amsterdam' CET+1:00:00 STD>)

但是我认为仅仅检测日期格式正则表达式是一个很好的解决方案。

在实际项目中,我会执行以下步骤:

  1. 尝试通过一组正则表达式(已知的日期格式)检查日期。
  2. 如果它是已知格式 - 使用带有预定义模式的 stdlib strptime
  3. 如果它是未知格式 - 使用 dateutil 中的慢速解析并写入一些警告以记录。
于 2013-09-07T03:50:03.170 回答
1

我不明白为什么一组正则表达式不起作用。有多种不同的格式,但实际上只有少数最常见的格式。比如说,使用十几个简单的正则表达式,您可能可以清除 90% 的日期。

另一种(部分)方法是扫描月份名称和缩写,然后扫描周围文本的日期和年份。

对于纯数字,最难的部分是弄清楚它是月份然后日期还是日期然后月份。如果日期部分大于 12,那么这很容易,但否则就真的不知道了。

您还可以查找具有属性的<time>元素,该datetime属性应该遵循明确的格式(尽管不一定一致)。

最重要的是,我认为没有任何一种方法可以找到文档中的所有日期,除非您知道它们都遵循相同的格式,这显然不会是一般情况。要很好地找到它们,您只需要采用几种不同的策略。

于 2013-09-07T03:43:50.923 回答