【问题标题】:Python 3: Parsing a date from a container stringPython 3:从容器字符串中解析日期
【发布时间】:2012-08-05 21:46:32
【问题描述】:

我有一个网页,我正在尝试从中获取日期。我知道格式是什么,所以解决方法应该和time.strptime(format)一样简单,但问题是这样的:
If string cannot be parsed according to format, or if it has excess data after parsing, ValueError is raised.
我正在尝试解析如下内容:

<tr><td align="center"><b>Create time</b></td>
</tr><tr><td align="center" bgcolor="#DDDDDD">Between August 1, 2012, 8:05 pm and August 1, 2012, 8:06 pm</td>  

对应的格式是%B %d, %Y(哪个日期并不重要,我只需要一个日期)。
我可以使用正则表达式(例如 ([JFMASOND][a-z]{2,8}) ([0-9]{1,2}), ([0-9]{4}) )来获取字符串的相关部分,但是我也可以从正则表达式中获取值本身并自己进行必要的转换。可以这么说,有什么方法可以在容器字符串上使用 strptime 吗? strptime 不应该太难在字符串上继续处理直到它得到格式匹配......
(如果我必须自己做,有没有比正则表达式更好的方法?)

【问题讨论】:

  • 首先,您使用的是 XML 解析器来解析 HTML,对吧?
  • @lkjoel:我不会使用 XML 解析器来解析 HTML。使用 BeautifulSoup。
  • 什么解析?我只需要页面中的日期。
  • @Dubslow:为了使日期解析更容易,您需要从 HTML 中提取文本,这就是 HTML 解析器所做的。
  • 是的,但是解析器只能告诉我 里面有什么,而且我需要清除大部分剩下的东西。

标签: python parsing datetime python-3.x


【解决方案1】:

我一直使用parsedatetime 模块从文本中提取日期。效果很好:

>>> import parsedatetime as pdt
>>> parser = pdt.Calendar(pdt.Constants())
>>> parser.parseDateText('Between August 1, 2012, 8:05 pm and August 1, 2012, 8:06 pm')
daysInMonth(8, 2012)
(2012, 8, 1, 17, 53, 18, 6, 218, 1)
>>> 

它几乎接受所有带有缩写的日期格式,除了 Sept.,我已将其发布到错误跟踪器但他们拒绝修复它,所以我只需将 Sept 替换为 Sep,它工作正常。

【讨论】:

  • 嗯...我认为它也可以处理字符串中的所有其他 HTML 废话?而且我对使用非标准库的东西有点犹豫,特别是因为它不比几行正则表达式短......
  • HTML 的东西本来就不应该在那里,所以你需要以某种方式清理它。至于解析器,使用非标准库模块有什么问题?它比任何自制的正则表达式解决方案都更好,并且会为您解析日期,无论格式如何。
  • 整页是11行表格;经历配置 HTMLParser 的麻烦比将 11 行 HTML 传递到 pdt 解析器要麻烦得多...
  • 如果您知道确切的输入,那很好。如果没有,使用BeautifulSoup,您可以在一行中解析HTML:cleaned = BeautifulSoup(html).find('td', {'bgcolor', '#DDDDDD'}).text
  • factordb.com/frame_moreinfo.php?id=1100000000525873586(查看源代码)它不起作用。无论如何,任何 HTML 解析器都需要查看字符串,这就是整个问题的意义所在。我确实知道解析器就在那里,我决定它们不会有用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-22
  • 2013-07-06
  • 1970-01-01
  • 2013-05-21
  • 1970-01-01
相关资源
最近更新 更多