【问题标题】:Python regular expression - get time and datePython 正则表达式 - 获取时间和日期
【发布时间】:2014-03-03 07:22:03
【问题描述】:

我需要创建一个正则表达式来从文本中获取时间和日期。 我试过了:

re.compile("title=\".* js-short-timestamp")

我只需要得到类似的东西:

21:14 - 2 de out de 2013
15:13 - 1 de out de 2013
14:16 - 1 de out de 2013
15:58 - 14 de set de 2013
16:06 - 13 de set de 2013
14:59 - 13 de set de 2013
12:43 - 13 de set de 2013
09:33 - 13 de set de 2013

obs:(我用了一些 re.sub 来只得到这些东西) 但有时我会得到:

18:30 - 11 de jul de 2011 href=https://twitter.com/XXXXXXXX/status/90533484464054272 
22:10 - 3 de jul de 2011 href=https://twitter.com/XXXXXXXXX/status/87689583726313472 

我的文字示例:

(obs 第一个带有 a-data-original-title 是我的问题,因为我得到了 href.. 我不想要它。)

    <a data-original-title="16:06 - 17 de jun de 2013" href="https://twitter.com/XXXXXXXX/status/346705537934712832" class="tweet-timestamp js-permalink js-nav js-tooltip"><span class="_timestamp js-short-timestamp " data-time="1371496016" data-long-form="true">17 de jun</span></a>
</small>

   <a href="https://twitter.com/XXXXXXXX/status/407906654579998720" class="tweet-timestamp js-permalink js-nav js-tooltip" title="14:18 - 3 de dez de 2013">span class="_timestamp js-short-timestamp " data-time="1386087499" data-long-form="true">3 de dez</span></a>

【问题讨论】:

  • 为什么不使用 HTML 解析器呢?

标签: python html regex twitter web-crawler


【解决方案1】:

您正在尝试使用正则表达式解析 HTML,此 rarely ends well

我会改用 HTML 解析器。我可以推荐你安装BeautifulSoup:

from bs4 import BeautifulSoup

soup = BeatifulSoup(html_page_source)

timestamps = soup.find_all('a', class=_'tweet-timestamp', {'data-original-title': True})
for timestamp in timestamps:
    print timestamp['data-original-title']

这会找到所有具有(至少)类tweet-timestampdata-original-title 属性的&lt;a&gt; 标记,然后打印该属性。

【讨论】:

    【解决方案2】:

    这应该是一个更好的正则表达式

    time_re = re.compile(r'data-original-title="([^"]+).*js-short-timestamp')
    

    然后你就可以使用findall了

    time_re.findall(s) # where s is you html string
    

    编辑:

    要同时执行这两个版本,您需要更复杂的正则表达式

    time_re = re.compile(r'data-original-title="([^"]+).*js-short-timestamp|tweet-timestamp.*title="([^"]+)"')
    
    [filter(None, x)[0] for x in time_re.findall(s)] # where s is your html string
    

    【讨论】:

    • 非常好!但是,我有两种类型的文本,一种是带有 data-orinal-title 的,另一种是只有标题的。有没有办法把它们放在一起?看看我的例子,你可以看到我在说什么
    • 正如@Martjin 指出的那样,使用 html 解析器可能会更好......但是对于正则表达式,我更新了我的答案以适用于两者。第二个问题是该类在 attr 之前(并且 twitter 可能随时更改其格式,因此使用 HTML 解析器将始终有效)。
    • 我将你的表达式更改为 re.compile(r'title="([^"]+).*js-short-timestamp') 现在一切正常,谢谢!
    • 是的,因为 js-short-timestamp 类附加到第二种类型的内部元素,所以它也可以工作。
    猜你喜欢
    • 2019-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-09
    • 1970-01-01
    • 1970-01-01
    • 2011-02-18
    • 1970-01-01
    相关资源
    最近更新 更多