如何处理诸如“5 分钟前”“3 小时前”“两天前”这样的时间 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
devzero
V2EX    Python

如何处理诸如“5 分钟前”“3 小时前”“两天前”这样的时间

  •  
  •   devzero 2017-02-24 20:50:45 +08:00 via Android 7021 次点击
    这是一个创建于 3151 天前的主题,其中的信息可能已经有所发展或是发生改变。
    爬到如题的一些关于时间的描述,不知道如何转换为当前计算机的时间
    第 1 条附言    2017-02-26 14:38:41 +08:00
    听大家说想想也对, x 分钟前, x 小时前当作当天处理, x 天前减去 x 天, x 星期前就减去 7 乘 x ,再往后就是 yyyy-mm-dd 的格式,就好处理了,多谢大家
    48 条回复    2017-02-26 23:03:51 +08:00
    dxwwym
        1
    dxwwym  
       2017-02-24 20:55:59 +08:00 via iPhone
    页面源码应该是时间,用 js 改的相对时间
    ineed
        2
    ineed  
       2017-02-24 20:57:59 +08:00 via Android
    js 可以用 moment.js
    devzero
        3
    devzero  
    OP
       2017-02-24 21:03:14 +08:00 via Android
    @dxwwym 并没有
    c4pt0r
        4
    c4pt0r  
       2017-02-24 21:06:24 +08:00
    那么简单的文法,手写一下 parser 咯,前段时间刚好写了个简单的 lexer 和 parser
    https://github.com/c4pt0r/calbot
    knightdf
        5
    knightdf  
       2017-02-24 21:14:35 +08:00
    @c4pt0r Don't panic, :)
    slysly759
        6
    slysly759  
       2017-02-24 21:32:45 +08:00 via Android
    懒的后端不写直接传 json 带时间戳
    前端 js 转换 if 判断
    勤快点的就后台梳理这么写的
    反正我就是这么写的

    不知道你为啥有这个需求。。。
    devzero
        7
    devzero  
    OP
       2017-02-24 22:02:10 +08:00 via Android
    @slysly759 我也很无奈啊
    chroming
        8
    chroming  
       2017-02-24 22:07:14 +08:00 via iPhone
    爬虫爬取网页会遇到这样的处理需求。没查过有没有现成轮子,要自己写的话就是匹配一下文字再转换就可以了
    sfree2005
        9
    sfree2005  
       2017-02-24 22:13:05 +08:00 via iPhone
    我没有写过爬虫,但如果可能,直接爬服务器返回的 json ,时间戳一般可以在里面找到。我写后端的时候就返回时间戳,到了前端我会用 moment.js 转成“ 3 小时前”之类的表达
    fy
        10
    fy  
       2017-02-24 22:13:50 +08:00
    实际上你爬虫爬这种数据,多半能在目标附近找到一个标准时间或者是时间戳。

    可以简单 parse 一下,然后用 pytime 这个库走一波就行了。
    noNOno
        11
    noNOno  
       2017-02-24 22:17:27 +08:00
    如果可以到数据库,那么同时保存一个入库时间,用 sql 处理>入库时间减去'N'分钟 where 包含 '分钟前'
    以此类推就可以了
    devzero
        12
    devzero  
    OP
       2017-02-24 22:18:51 +08:00 via Android
    @sfree2005 很可惜是写死在网页里的
    noNOno
        13
    noNOno  
       2017-02-24 22:19:25 +08:00
    你是不是抓的视频网站。。。。
    devzero
        14
    devzero  
    OP
       2017-02-24 22:20:54 +08:00 via Android
    @noNOno 我是爬到的数据
    BiggerLonger
        15
    BiggerLonger  
       2017-02-24 22:23:15 +08:00 via Android
    python arrow
    noNOno
        16
    noNOno  
       2017-02-24 22:23:44 +08:00
    那就 同时获取你爬取到那条数据的时间,然后减去 'X 小时' 就可以了。就是要加个计算,我目前就是这样在数据库层面离线处理
    sfree2005
        17
    sfree2005  
       2017-02-24 22:26:18 +08:00 via iPhone
    @devzero 你看网站 HTML 源码是写死的 但有没有查过 Chrome dev tool 里面的 network 标签?如果这里面也没有那只能肯定那个是后端处理了。即使你通过转换,得到的时间都只是大概的
    HanSonJ
        18
    HanSonJ  
       2017-02-24 22:30:18 +08:00
    HanSonJ
        19
    HanSonJ      2017-02-24 22:31:35 +08:00
    没看认真题主问题 - -, 忽略我。。。
    polythene
        20
    polythene  
       2017-02-24 22:38:54 +08:00   2
    @chroming 刚写了一个工具,用来将自然语言中的时间信息提取出来,再转化成具体的时间,可以参考一下:
    https://github.com/polyrabbit/WeCron/blob/master/WeCron/wxhook/todo_parser/local_parser.py
    devzero
        21
    devzero  
    OP
       2017-02-24 22:45:09 +08:00 via Android
    @sfree2005 嗯,确认了
    嘛,至少比日期精确
    ming2050
        22
    ming2050  
       2017-02-24 22:51:01 +08:00 via iPhone
    我更喜欢 shell
    qhxin
        23
    qhxin  
       2017-02-24 23:03:01 +08:00 via Android
    strtotime php 是世界上最好的语言
    sunchen
        24
    sunchen  
       2017-02-24 23:09:16 +08:00
    自己算一下呗,算个大概时间
    FreeDog
        25
    FreeDog  
       2017-02-24 23:10:12 +08:00
    总共就那些固定格式,收集、判断、提取字符串转换下即可
    FreeDog
        26
    FreeDog  
       2017-02-24 23:10:43 +08:00
    做好了可以传到 pip 或者 GitHub 上~ 应该不少人会用到
    onlyhot
        27
    onlyhot  
       2017-02-24 23:12:43 +08:00 via iPhone
    已经有人说过了 我再说一遍 php 是最好的语言..
    cxbig
        28
    cxbig  
       2017-02-24 23:14:50 +08:00
    具体分析下咯
    看看这个内容的背后是什么机制驱动的,如果是纯前端,多半在什么地方有时间戳,只要数据不是藏在闭包里,还是有机会拿到的
    实在不行,要求不是那么精确的话,根据文法用正则翻译一下
    如“一小时以前”可以变成 date.today() - timedelta(hours = 1)什么的
    GG668v26Fd55CP5W
        29
    GG668v26Fd55CP5W  
       2017-02-24 23:18:08 +08:00 via iPhone
    写个 strtotime 的 PHP 脚本, Python 里调用 PHP 脚本获取结果,(逃
    nightv2
        30
    nightv2  
       2017-02-24 23:20:01 +08:00 via Android
    @cxbig v2 的也包含时间戳么?
    run2
        31
    run2  
       2017-02-24 23:32:33 +08:00   1
    因为最终大多数都变成多少天前,所以你这个数据的精度要不了那么高吧,直接算日子,省略时间吧
    devzero
        32
    devzero  
    OP
       2017-02-24 23:33:55 +08:00 via Android
    @sobigfish 说得也是
    cxbig
        33
    cxbig  
       2017-02-24 23:41:10 +08:00
    @nightv2 没仔细研究,看上去是没有实时更新的。不过精确到分钟,想来精度是够用的。
    devzero
        34
    devzero  
    OP
       2017-02-24 23:41:51 +08:00 via Android
    @BiggerLonger 是用 arrow.get 么...
    trcnkq
        35
    trcnkq  
       2017-02-25 01:31:34 +08:00   1
    这里其实隐含了另一个问题:“ 5 分钟前”“ 3 小时前”“两天前”表示的精度是不一样的,都转化成一个精确到秒且没有其他信息的数据并不合适。
    malcolmyu
        36
    malcolmyu  
       2017-02-25 01:57:28 +08:00
    precisi0nux
        37
    precisi0nux  
       2017-02-25 06:16:32 +08:00 via iPhone
    @falcon05 php 有更好的实现, Carbon
    ikaros
        38
    ikaros  
       2017-02-25 10:06:16 +08:00
    我觉得问题在于不同的网站都各有一套显示规则,还不止这个显示方式,新闻抓取就这毛病
    xiaonengshou
        39
    xiaonengshou  
       2017-02-25 10:19:59 +08:00
    竟然有人妄图让后端转换这些东西。。。如果在实际项目里,后端转换了,这个项目就废了
    noNOno
        40
    noNOno  
       2017-02-25 10:30:58 +08:00
    @xiaonengshou 看需求,如果爬下来的数据是要离线分析用, ETL 时处理也没什么
    klxq15
        41
    klxq15  
       2017-02-25 11:33:09 +08:00 via Android
    在爬 weibo 的数据时也遇到这个问题,以前的 json 接口带时间戳,不过那个接口废了,新接口只有这样的时间
    sefemp
        42
    sefemp  
       2017-02-25 14:55:16 +08:00 via Android
    如果爬的够勤快,理论上只需要处理分钟即可
    southwolf
        43
    southwolf  
       2017-02-25 19:05:20 +08:00
    @xiaonengshou 通常就是后端转换的啊
    southwolf
        44
    southwolf  
       2017-02-25 19:09:12 +08:00
    @xiaonengshou 比如最方便的 Rails 直接提供 time_ago_in_words 方法…
    jon
        45
    jon  
       2017-02-26 09:11:04 +08:00 via Android
    @falcon05 php 不愧是最好的语言
    dofine
        46
    dofine  
       2017-02-26 15:23:49 +08:00
    Python 可以用 pendulum
    https://github.com/sdispater/pendulum

    ```
    >>> past = pendulum.now().subtract(minutes=2)
    >>> past.diff_for_humans()
    >>> '2 minutes ago'
    ```
    devzero
        47
    devzero  
    OP
       2017-02-26 19:21:42 +08:00 via Android
    @dofine 昂...我是要逆转换
    why1
        48
    why1  
       2017-02-26 23:03:51 +08:00 via Android
    爬附件的上传时间
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     976 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 30ms UTC 23:12 PVG 07:12 LAX 16:12 JFK 19:12
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86