V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
推荐学习书目
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 · Feb 24, 2017 via Android · 7387 views
    This topic created in 3348 days ago, the information mentioned may be changed or developed.
    爬到如题的一些关于时间的描述,不知道如何转换为当前计算机的时间
    Supplement 1  ·  Feb 26, 2017
    听大家说想想也对, x 分钟前, x 小时前当作当天处理, x 天前减去 x 天, x 星期前就减去 7 乘 x ,再往后就是 yyyy-mm-dd 的格式,就好处理了,多谢大家
    48 replies    2017-02-26 23:03:51 +08:00
    dxwwym
        1
    dxwwym  
       Feb 24, 2017 via iPhone
    页面源码应该是时间,用 js 改的相对时间
    ineed
        2
    ineed  
       Feb 24, 2017 via Android
    js 可以用 moment.js
    devzero
        3
    devzero  
    OP
       Feb 24, 2017 via Android
    @dxwwym 并没有
    c4pt0r
        4
    c4pt0r  
       Feb 24, 2017
    那么简单的文法,手写一下 parser 咯,前段时间刚好写了个简单的 lexer 和 parser
    https://github.com/c4pt0r/calbot
    knightdf
        5
    knightdf  
       Feb 24, 2017
    @c4pt0r Don't panic, :)
    slysly759
        6
    slysly759  
       Feb 24, 2017 via Android
    懒的后端不写直接传 json 带时间戳
    前端 js 转换 if 判断
    勤快点的就后台梳理这么写的
    反正我就是这么写的

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

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

    ```
    >>> past = pendulum.now().subtract(minutes=2)
    >>> past.diff_for_humans()
    >>> '2 minutes ago'
    ```
    devzero
        47
    devzero  
    OP
       Feb 26, 2017 via Android
    @dofine 昂...我是要逆转换
    why1
        48
    why1  
       Feb 26, 2017 via Android
    爬附件的上传时间
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   950 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 122ms · UTC 22:41 · PVG 06:41 · LAX 15:41 · JFK 18:41
    ♥ Do have faith in what you're doing.