是否有可能从终端中的网站获取文本

是否有可能从终端中的网站获取文本

我想从学校网站上获取时间表并在脚本中使用它来设置自动警报,但我不知道如何做。

看来我的学校使用全日历设置时间表,使时间不是.html文件中的HTML标签。

答案1

由于我们没有您想要抓取数据的真实网站,而且如果您没有一些标准化的 API,网站抓取总是不同的,因此不可能提供 100% 有效的解决方案。但我会尝试解释一种获取您信息的方法。

fullcalender.io基于 Javascript,事件设置为 Javascript 对象,或者可以从json格式导入。如果是后者,您可以轻松下载json在 Javascript 源代码中引用的现成文件。关于解析json,这里有很多问题和答案。

如果它被设置为一个 Javascript 对象,您就可以解析该.js文件,或者如果它包含在 html<script>标签中,则可以解析该对象的 html $('#calendar').fullCalendar(

我们可以使用curl来获取网站,然后使用例如提取信息awk


我写了一个小脚本来获取对象fullcalender.io 基本视图演示。您的脚本可能看起来类似。

curl -s https://fullcalendar.io/releases/fullcalendar/3.9.0/demos/basic-views.html \
  | awk '/\.fullCalendar\(\{/{s=1; print "{"; next;};
         /\}\)\;/{s=0};
         s{print};
         END{print "}";}'

解释:

  • /\.fullCalendar\(\{/{s=1; print "{"; next;};搜索.fullCalender({,如果找到则设置变量s=1并打印{
  • /\}\)\;/{s=0};搜索)};并设置变量s=0
  • s{print};s如果设置了并且不为 0,则打印该行。
  • END{print "}";}'}在最后打印。

输出:

{
  header: {
    left: 'prev,next today',
    center: 'title',
    right: 'month,basicWeek,basicDay'
  },
  defaultDate: '2018-03-12',
  navLinks: true, // can click day/week names to navigate views
  editable: true,
  eventLimit: true, // allow "more" link when too many events
  events: [
    {
      title: 'All Day Event',
      start: '2018-03-01'
    },
    {
      title: 'Long Event',
      start: '2018-03-07',
      end: '2018-03-10'
    },
    {
      id: 999,
      title: 'Repeating Event',
      start: '2018-03-09T16:00:00'
    },
    {
      id: 999,
      title: 'Repeating Event',
      start: '2018-03-16T16:00:00'
    },
    {
      title: 'Conference',
      start: '2018-03-11',
      end: '2018-03-13'
    },
    {
      title: 'Meeting',
      start: '2018-03-12T10:30:00',
      end: '2018-03-12T12:30:00'
    },
    {
      title: 'Lunch',
      start: '2018-03-12T12:00:00'
    },
    {
      title: 'Meeting',
      start: '2018-03-12T14:30:00'
    },
    {
      title: 'Happy Hour',
      start: '2018-03-12T17:30:00'
    },
    {
      title: 'Dinner',
      start: '2018-03-12T20:00:00'
    },
    {
      title: 'Birthday Party',
      start: '2018-03-13T07:00:00'
    },
    {
      title: 'Click for Google',
      url: 'http://google.com/',
      start: '2018-03-28'
    }
  ]
}

然后,您可以使用 python 将 JS 对象解析为 JSON 对象demjson

安装demjson

pip3 install demjson

然后运行这个:

curl -s https://fullcalendar.io/releases/fullcalendar/3.9.0/demos/basic-views.html \
  | awk '/\.fullCalendar\(\{/{s=1; print "{"; next;};
         /\}\)\;/{s=0};
         s{print};
         END{print "}";}' \
  | python3 -c "import demjson, sys, json; print(json.dumps(demjson.decode('\n'.join(sys.stdin.readlines()))));" \
  | jq ".events"

从这里开始,使用 应该相当容易jq。当然,你可以用bash而不是jq来完成整个过程Python

答案2

网络同步bash 脚本用于wget在此处检索答案询问 Ubuntu。它会搜索 HTML 标签来查找问题赞成票和答案赞成票。它会将特殊 HTML 符号(例如&amp&&lt转换为<等。

以下是一些可能对您有帮助的代码片段:

LineOut=""
HTMLtoText () {
    LineOut=$1  # Parm 1= Input line
    LineOut="${LineOut//&amp;/&}"
    LineOut="${LineOut//&lt;/<}"
    LineOut="${LineOut//&gt;/>}"
    LineOut="${LineOut//&quot;/'"'}"
    LineOut="${LineOut//&#39;/"'"}"
    LineOut="${LineOut//&ldquo;/'"'}"
    LineOut="${LineOut//&rdquo;/'"'}"
} # HTMLtoText ()

Ampersand=$'\046'

(... SNIP LINES ...)

while IFS= read -r Line; do

(... SNIP LINES ...)

# Convert HTML codes to normal characters
HTMLtoText $Line
Line="$LineOut"

(... SNIP LINES ...)

done < "/tmp/$AnswerID"

(... SNIP LINES ...)

wget -O- "${RecArr[$ColWebAddr]}" > "/tmp/$AnswerID"
if [[ "$?" -ne 0 ]]               # check return code for errors
  then
    # Sometimes a second attempt is required. Not sure why.
    wget -O- "${RecArr[$ColWebAddr]}" > "/tmp/$AnswerID"
fi
if [[ "$?" == 0 ]]               # check return code for errors
  then
      echo "$BarNo:100" > "$PercentFile"
      echo "$BarNo:#Download completed." > "$PercentFile"
  else
      echo "$BarNo:100" > "$PercentFile"
      echo "$BarNo:#Download error." > "$PercentFile"
      echo "ERROR: $AnswerID" >> ~/websync.log
      return 1
fi

相关内容