【问题标题】:Pattern matching in Python regexpPython 正则表达式中的模式匹配
【发布时间】:2015-04-07 18:54:45
【问题描述】:

如何在 python 中使用正则表达式从 html <div> 标签中提取日期。 html是这样的

<div><strong>Date:<\/strong> Monday April 6, 2015 at 4:41PM <div>

我需要以“yyyy-dd-mm hh:mm”格式获取日期。输出应该是“2015-04-06 16:41”

【问题讨论】:

  • 你能用你的例子展示yyyyddmmhhmm吗?
  • 使用DOMXPath从html中提取数据。例如,lxml 扩展可以做到这一点。

标签: python html regex


【解决方案1】:

我不会使用正则表达式来解决问题(参见RegEx match open tags except XHTML self-contained tags),而是使用HTML ParserBeautifulSoupdateutil 来提取日期。提取日期后,使用strftime() 将其转储为所需格式的字符串:

>>> from bs4 import BeautifulSoup
>>> from dateutil import parse
>>> s = "<div><strong>Date:</strong> Monday April 6, 2015 at 4:41PM <div>"
>>> text = soup.find('div').text
>>> parse(text, fuzzy=True).strftime("%Y-%d-%m %H:%M")
'2015-06-04 16:41'

【讨论】:

  • lxml 不是更适合现实世界的用例吗?
  • @hek2mgl 我会说这是基于意见的。同一个任务有不同的包。虽然我还没有见过像BeautifulSoup 这样易于使用和自然的库。
  • (我是 Python 新手)如果 HTML 发生变化,通过 XPath 访问元素是否比逐步遍历每个节点直到目标更直接和可维护?我的意思是 Beatifulsoup 可以使用 lxml 作为低级解析器,但不支持 xpath。我不明白为什么。
  • @hek2mgl 好吧,这些只是实现类似目标的不同机制。例如。什么对你来说更易读://td[@class="test"]/following-sibling::div,还是soup.find('td', class_='test').find_next_sibling('div')?另外,BeautifulSoup 支持 CSS 选择器,您可以将其视为 XPath 的替代方法来定位元素。
【解决方案2】:

仅使用 RegEx 是不可能的,因为当它不在源中时,您无法匹配月份。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-18
    • 2016-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多