我想从学校网站上获取时间表并在脚本中使用它来设置自动警报,但我不知道如何做。
看来我的学校使用全日历设置时间表,使时间不是.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 符号(例如&
和&
)<
转换为<
等。
以下是一些可能对您有帮助的代码片段:
LineOut=""
HTMLtoText () {
LineOut=$1 # Parm 1= Input line
LineOut="${LineOut//&/&}"
LineOut="${LineOut//</<}"
LineOut="${LineOut//>/>}"
LineOut="${LineOut//"/'"'}"
LineOut="${LineOut//'/"'"}"
LineOut="${LineOut//“/'"'}"
LineOut="${LineOut//”/'"'}"
} # 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