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 · 6536 次点击
    这是一个创建于 2827 天前的主题,其中的信息可能已经有所发展或是发生改变。
    爬到如题的一些关于时间的描述,不知道如何转换为当前计算机的时间
    第 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 嗯,确认了
    嘛,至少比日期精确
    mringg
        22
    mringg  
       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)什么的
    falcon05
        29
    falcon05  
       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 的也包含时间戳么?
    sobigfish
        31
    sobigfish  
       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   ·   实用小工具   ·   984 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 20:24 · PVG 04:24 · LAX 12:24 · JFK 15:24
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.