【问题标题】:Get time in HTML tags using curl and grep/sed/awk使用 curl 和 grep/sed/awk 在 HTML 标记中获取时间
【发布时间】:2014-10-12 17:26:53
【问题描述】:

我正在尝试仅从该网页中提取到达时间。我在 OSX 10.9.5 的终端上运行它

http://www.flyokc.com/Arrivals.aspx

我只隔离了标签

curl 'www.flyokc.com/arrivals.aspx' | grep 'labelTime'

但是,我的 RegEx 很糟糕,所以我还没有想出只是从这些标签中获取时间。对我如何做到这一点的想法?

最后,我想按一天中的时间对它们进行分组,并按小时显示到达人数,按降序排列

【问题讨论】:

  • 你的意思是curl 'www.flyokc.com/arrivals.aspx' | grep -oP 'labelTime">\K[^<>]*'
  • 它不喜欢那种 curl 'www.flyokc.com/arrivals.aspx' | grep -oP 'labelTime">\K[^]*' 0 用法:grep [-abcDEFGHhIiJLlmnOoPqRSsUVvwxZ] [-A num] [-B num] [-C[num]] [-e 模式] [-f 文件] [--binary-files=value] [--color=when] [--context[=num]] [--directories=action] [--label] [--line-buffered] [--null] [模式] [文件 ...] 5 310k 5 17079 0 0 33998 0 0:00:09 --:--:-- 0:00:09 33954 curl: (23) 书写体失败 (0 != 1448)
  • 尝试使用 xmllint 来解析 html/xml。

标签: regex bash curl awk sed


【解决方案1】:

用正则表达式解析 HTML/XML 很糟糕。可悲的是,这似乎适用于您的用例:

gawk '
BEGIN{
    PROCINFO["sorted_in"]="@ind_num_asc"
    FS="[<>: ]+"
}
/labelTime/&&/ContentPlaceHolderMain/{
    if($6="PM") a[$4+12]+=1
    else a[$4]+=1
}
END{
    for(h in a)
        print h, a[h]
}' <(curl 'www.flyokc.com/arrivals.aspx' 2>/dev/null)

编辑:说明为什么有效:

  • 将字段分隔符设置为 html 分隔符、间距和 HH:MM 分隔符。

  • 然后抓取第六个字段(小时) (从某种意义上说,这只是您要求的正则表达式...)

  • 如果第六个字段是“PM”,则添加 12 小时(您希望最后按数字排序)。 +1 该小时的计数。

  • 处理输入后,显示结果。因为数组访问顺序已经定义为对键进行数字排序,所以不需要外部排序命令。

【讨论】:

  • 我从中得到的输出如下 22 10 23 4 24 3 13 1 14 7 15 3 16 13 17 4 18 7 19 8 20 5 21 6 这是一天中的小时数,对吗?
【解决方案2】:

如果您只是想获取到达时间,例如下午 12:00 等,awkcurl 应该可以:

curl -s 'http://flyokc.com/arrivals.aspx' | awk '/labelTime/{print substr($2,68,5),substr($3,1,2)}'

输出:

12:47 PM
...

它是如何工作的:

CURL 默默地抓取网页的来源,然后AWK 获取输出并使用“labelTime”选择包含到达时间的行。由于 awk 抓取了字符串所在的整个&lt;span&gt;,因此子字符串用于从位置 68 开始,然后打印结果。

【讨论】:

  • 这工作正常,谢谢。另一个答案按小时对它们进行分组并输出计数,但我后来添加了该请求。感谢您的回答。
猜你喜欢
  • 2014-07-21
  • 2012-08-02
  • 2017-12-13
  • 1970-01-01
  • 2019-06-28
  • 1970-01-01
  • 2011-12-26
  • 1970-01-01
  • 2012-10-20
相关资源
最近更新 更多