0

我有几个 Google 日历,我想使用Samurize合并并放置在我的 Windows 桌面上。我试过使用 Samurize 的 Page Scraper 插件,但它似乎不能胜任这项任务。

我可以让 Samurize 运行脚本并将其输出放在桌面上,但我不确定执行此操作的最佳工具是什么。

我拥有的所有网址都是以下形式:

http://www.google.com/calendar/feeds/example%40gmail.com/private-REMOVED/basic?futureevents=true&orderby=starttime&sortorder=ascending&singleevents=true

所以我可以使用 curl 获取它们,但是我需要过滤它们。

我想要的东西看起来像:

2009 12 02  Event from calendar 1's description 
2009 12 03  Event from calendar 2's description 
2009 12 04  Event from calendar 1's description 
2009 12 05  Event from calendar 3's description 
2009 12 06  Event from calendar 1's description 

但是,日历提要中的日期格式如下:

<title type='html'>Event from calendar 1's description</title><summary type='html'>When: Fri 5 Dec 2008&lt;br&gt;

那么如何过滤掉日期和描述,并转换日期呢?

(我已经安装了 cygwin,所以使用 perl 或 sed/awk 的东西会很完美,因为我对它们足够熟悉,所以我有信心在未来改变它们,但我愿意接受建议。)

4

3 回答 3

1

我正在学习 perl,所以请不要笑得太厉害,但这里有一些东西可能会让你大部分时间解析:

#!C:\Perl\bin -w
use strict;

my %months = ("Jan", "01", "Feb", "02", "Mar", "03", ... etc. etc. ... "Dec", "12");

$_ = "<title type='html'>Event from calendar 1's description</title><summary type='html'>When: Fri 5 Dec 2008<br>";

if (/<title type='html'>([\d\D]*)<\/title><summary type='html'>When: (\S+) (\S+) (\S+) (\S+)<br>/)
{
    print "$5 $months{$4} $3 $1\n";
}
于 2008-12-02T22:47:38.980 回答
1

基于 John W 的脚本,这就是我正在使用的

#!c:\cygwin\bin\perl.exe -w
use strict;
use LWP::Simple qw(get);

my %calendars = ( "Sam Hasler", "http://www.google.com/calendar/feeds/blah/blah/basic"
                , "Family    ", "http://www.google.com/calendar/feeds/blah/blah/basic"
                , "Work      ", "http://www.google.com/calendar/feeds/blah/blah/basic"
                );

my $params = "?futureevents=true&orderby=starttime&sortorder=ascending&singleevents=true";

my %months = ( "Jan", "01", "Feb", "02", "Mar", "03", "Apr", "04"
             , "May", "05", "Jun", "06", "Jul", "07", "Aug", "08"
             , "Sep", "09", "Oct", "10", "Nov", "11", "Dec", "12");

my $calendar_name;
my $calendar_url;
my @lines;

while (($calendar_name, $calendar_url) = each(%calendars)){
    my $calendar_data = get "$calendar_url$params";
    @lines = split(/\n/, $calendar_data);

    foreach (@lines) {
        if (/<title type='html'>([\d\D]*)<\/title><summary type='html'>When: (\S+) (\S+) (\S+) (\S+)&lt;br&gt;/)
        {
            my $day = "$3";
            if ($3 < 10 ) {
                $day = "0$3";
            }

            print "$5 $months{$4} $day\t$calendar_name\t$1\n";
        }
    }

}

我只是通过管道输出sort以按日期顺序获取它。

更新:我已将我的脚本转换为插件并将其提交到 Samurize 网站:Merge Google Calendar feeds

于 2008-12-03T00:24:03.653 回答
1

两个想法。

您可以使用 Yahoo Pipes(请参阅这篇文章。)

或者,如果您不想等待 Yahoo 刷新其数据,这里有一个正在开发的用于合并 ICAL 文件的 python 脚本。

于 2009-04-23T14:07:25.990 回答