【问题标题】:How to extract substrings and numbers from curl result using grep or other method如何使用 grep 或其他方法从 curl 结果中提取子字符串和数字
【发布时间】:2019-07-12 05:47:30
【问题描述】:

这是我的第一个问题/帖子,我对使用正则表达式非常陌生。尽管进行了大量的搜索和试验(例如,-o 和 -w 选项),但我似乎无法完成以下工作(而且我很尴尬地发布了我所有失败的尝试,但请参阅帖子的结尾) .我正在尝试从网站中提取一些天气详细信息(状态、温度和风信息)。

我正在使用以下语句将适当的信息提取到文本文件中,然后我想用 grep 提取信息。当前天气列在顶部,所以我只需要前几行(head -n 7)。您可以访问该网站 (https://wttr.in/[city]) 并输入一个 [城市] 以查看结果的多样性。

curl -s wttr.in/fargo | head -n 7 > ~/Downloads/weather.cache

以下是我面临的问题/挑战:

  1. 每一行都有一些“棍子”艺术,用颜色编码。这些代码与“棒”文本一起被提取到文本文件中。
  2. 当前天气状态可以是一个词(晴天)或多个词(部分多云)。我想要一切。
  3. 温度可以是单个数字 (5 °F)、范围 (0-15 °F),当然也可以是负数 (-10--5 °F)。我需要所有信息。
  4. 风向和风速 (↘ 8 mph)。同样,速度可以是一个范围(5-16 mph)。风向是我想捕捉的特殊/unicode 字符。
  5. 我想将每个项目 (#2-4) 分配给它自己的变量,而不需要从行中添加任何额外内容。

上述示例的理想结果将用于状态栏,如下所示。

天气 = “晴天”

温度 = “-22--5°F”

风 = “↘ 8 mph”

任何帮助将不胜感激。提前道歉,因为我努力正确地格式化这篇文章。

背景

实际网站视图如下,但没有“太阳”简笔画和“8”(风速)的颜色编码。注意:由于发布软件(可能是我缺乏知识),颜色编码不正确。因此,访问原始站点 (https://wwtr.in/fargo) 可能会有所帮助。

Weather report: Fargo, United States of America

         \   /     Sunny
          .-.      -22--5 °F      
       - (   ) -   ↘ 8 mph        
          `_'      9 mi           
         /   \     0.0 in 



Curl result is below, which is being stored in the weather cache file I'm working with.

Weather report: Fargo, United States of America

 [38;5;226m    \   /    [0m Sunny
 [38;5;226m     .-.     [0m [38;5;021m-22[0m-[38;5;021m-5[0m °F[0m      
 [38;5;226m  ― (   ) ―  [0m [1m↘[0m [38;5;226m8[0m mph[0m        
 [38;5;226m     `-’     [0m 9 mi[0m           
 [38;5;226m    /   \    [0m 0.0 in[0m

===

一些尝试

以温度为例,这是我最近的一次。

egrep --regexp='-?[[:digit:]].*°F'


  .-.      -22--5 °F

失败的尝试包括(也尝试过 -w 选项)。

    grep -m 1 -Eo -e '-?[[:digit:]].*°F'

38;5;226m     .-.      -22--5 °F

【问题讨论】:

  • 我有点困惑。您是在尝试创建在后台显示的页面,还是在尝试解析在后台显示的页面?基本上,简洁地查看您尝试挖掘的一些原始文本以及您尝试生成的示例会很棒。
  • 我对解析页面的一部分很感兴趣,但对于像我这样的初学者来说,这还不够“干净”。我没有做任何花哨的事情,只是试图将一些信息拉入并插入到我的 i3 状态栏中(现在回到我的待办事项列表中——现在没有什么可分享的)。我知道其他状态栏都有预建的天气模块,但我想借此机会学习一些网页抓取和文本提取方法。

标签: regex curl awk grep extract


【解决方案1】:

使用 lynx 代替 curl,你不会得到所有的格式化字符:

$ lynx --dump 'https://wttr.in/fargo' | head
Weather report: Fargo, United States of America

     \   /     Sunny
      .-.      -11-1 °F
   ― (   ) ―   ↘ 8 mph
      `-’      9 mi
     /   \     0.0 in
                                                       ┌─────────────┐

┌──────────────────────────────┬───────────────────────┤  Mon 18 Feb ├────────

.

$ lynx --dump 'https://wttr.in/fargo' |
awk '
    BEGIN{ split("_ _ Weather Temp Wind",m) }
    NR>2 && NR in m{ sub(/.*  /,""); print m[NR] " = \"" $0 "\"" }
'
Weather = "Sunny"
Temp = "-11-1 °F"
Wind = "↘ 8 mph"

【讨论】:

  • 在单独的上下文中,我使用了 lynx,但没有使用任何选项。不过,是时候学习一些 awk 了。哇,几行代码(以及正确的程序/命令)如何解决问题总是让我感到惊讶。感谢您分享您的专业知识。
【解决方案2】:

指出 API 允许以其他方式下载会不会很无聊?

例如。各种短格式,例如:

curl "http://wttr.in/Fargo?format=4"
curl "http://wttr.in/Fargo?format=%l:%c:%t:%w"

或html:

curl -H 'User-Agent: mozilla/compatible' http://wttr.in/Fargo

后者有助于插入逻辑标记。

另一种去除 ANSI 转义的方法是:

curl -s http://wttr.in/Fargo | head -7 | colorize --clean-all

如果您有 colorize 实用程序(适用于各种 Linux 发行版)。

【讨论】:

  • 是的,我完全错过了 API 详细信息的链接。学过的知识。您添加的关于插入逻辑标记、剥离转义和使用颜色实用程序的 cmets 都是有用的选项,尤其是当我想做一些其他集中的网络报废任务时。总是很棒的学习。谢谢。
猜你喜欢
  • 2019-04-16
  • 1970-01-01
  • 2023-02-21
  • 2020-06-25
  • 1970-01-01
  • 2010-12-18
  • 1970-01-01
  • 2014-08-31
  • 1970-01-01
相关资源
最近更新 更多