Perl で、RSS で配信されたエントリーの日付を処理する

HTTP::Date クラスを使うと RSS で配信されたエントリーの日付 (dc:date) を変換してくれる。この場合、RSS のソースによって米国から日本のニュースにアクセスした場合などは、時差 (タイムゾーン) を考慮する必要があるため注意する。 使用するクラス
use HTTP::Date;
#!/usr/bin/perl

use LWP::UserAgent;
use HTTP::Request;
use HTTP::Date;

# 初期化
my $html;
my $timezone = 'JST';
my $url    = 'https://www.yoursite.com/index.rdf';
my $rss    = new XML::RSS;
my $proxy  = new LWP::UserAgent;       # UseAgent の作成
my $req    = new HTTP::Request(GET=>$url);
my $res    = $proxy->request($req);    # $url にアクセスする
my $xml    = $res->content;            # コンテンツ (この場合は RSS/XML) を取得

# RSS を解析
eval {
    $rss->parse($xml);
};

if($@) {
    # $rss->parse が失敗したとき
}

# @{$rss->{items}} に、RSS のすべてのエントリー (item) が入る
foreach my $item ( @{$rss->{items}} ) {

    my $date        = HTTP::Date::str2time($item->{dc}->{date}, $timezone);

    $html    .=    qq|<a href=$item->{link}>$item->{title}</a><br>\n|; # タイトルをリンクつきで出力
    $html    .=    qq|$description<br>|    if $item->{description};    # 概要 (description) を出力
    $html    .=    qq|[<a href=$item->{link}>続きを読む</a>]<hr size=1>\n|;
}

print $html;

1;
HTTP::Date クラスを使うと RSS で配信されたエントリーの日付 (dc:date) を変換してくれる。この場合、RSS のソースによって米国から日本のニュースにアクセスした場合などは、時差 (タイムゾーン) を考慮する必要があるため注意する。 使用するクラス
use HTTP::Date;
#!/usr/bin/perl

use LWP::UserAgent;
use HTTP::Request;
use HTTP::Date;

# 初期化
my $html;
my $timezone = 'JST';
my $url    = 'https://www.yoursite.com/index.rdf';
my $rss    = new XML::RSS;
my $proxy  = new LWP::UserAgent;       # UseAgent の作成
my $req    = new HTTP::Request(GET=>$url);
my $res    = $proxy->request($req);    # $url にアクセスする
my $xml    = $res->content;            # コンテンツ (この場合は RSS/XML) を取得

# RSS を解析
eval {
    $rss->parse($xml);
};

if($@) {
    # $rss->parse が失敗したとき
}

# @{$rss->{items}} に、RSS のすべてのエントリー (item) が入る
foreach my $item ( @{$rss->{items}} ) {

    my $date        = HTTP::Date::str2time($item->{dc}->{date}, $timezone);

    $html    .=    qq|<a href=$item->{link}>$item->{title}</a><br>\n|; # タイトルをリンクつきで出力
    $html    .=    qq|$description<br>|    if $item->{description};    # 概要 (description) を出力
    $html    .=    qq|[<a href=$item->{link}>続きを読む</a>]<hr size=1>\n|;
}

print $html;

1;

Perl で、RSS を処理する

使用するモジュール
use Encode;
use Encode::Guess;
use XML::RSS;
use LWP::UserAgent;
use HTTP::Request;
#!/usr/bin/perl

use Encode;
use Encode::Guess;
use XML::RSS;
use LWP::UserAgent;
use HTTP::Request;

my $url = 'https://perltips.twinkle.cc/index.rdf';

# 初期化
my $proxy = new LWP::UserAgent;       # UseAgent の作成
my $req   = new HTTP::Request(GET=>$url);
my $rss   = new XML::RSS;
my $res   = $proxy->request($req);    # $url にアクセスする
my $xml   = $res->content;            # コンテンツ (この場合は RSS/XML) を取得
my $enc   = guess_encoding($xml, qw/euc-jp shiftjis 7bit-jis utf8/); # 文字コードを判定
ref($enc) or die "Can't guess: $enc"; # 自動判定がうまくいかなかったときのエラー処理
# utf8 で保存 ($enc->name を decode することにより、utf8 で変数に保管される
$xml = decode($enc->name, $xml);

eval {
    $rss->parse($xml);
};

if($@) { # $rss->parse が失敗したとき
    print "error\n";
}

# @{$rss->{items}} に、RSS のすべてのエントリー (item) が入る
foreach my $item ( @{$rss->{items}} ) {

    # ケータイ (iモード) で出力したいので Shift_JIS にする
    my $title       = encode('shiftjis', $item->{title});
    my $description = encode('shiftjis', $item->{description}); # 上に同じ

    print qq|<a href="$item->{link}">$title</a>\n|; # タイトルをリンクつきで出力
    print qq|$description<br />\n|;                 # 概要 (description) を出力
}

exit;
使用するモジュール
use Encode;
use Encode::Guess;
use XML::RSS;
use LWP::UserAgent;
use HTTP::Request;
#!/usr/bin/perl

use Encode;
use Encode::Guess;
use XML::RSS;
use LWP::UserAgent;
use HTTP::Request;

my $url = 'https://perltips.twinkle.cc/index.rdf';

# 初期化
my $proxy = new LWP::UserAgent;       # UseAgent の作成
my $req   = new HTTP::Request(GET=>$url);
my $rss   = new XML::RSS;
my $res   = $proxy->request($req);    # $url にアクセスする
my $xml   = $res->content;            # コンテンツ (この場合は RSS/XML) を取得
my $enc   = guess_encoding($xml, qw/euc-jp shiftjis 7bit-jis utf8/); # 文字コードを判定
ref($enc) or die "Can't guess: $enc"; # 自動判定がうまくいかなかったときのエラー処理
# utf8 で保存 ($enc->name を decode することにより、utf8 で変数に保管される
$xml = decode($enc->name, $xml);

eval {
    $rss->parse($xml);
};

if($@) { # $rss->parse が失敗したとき
    print "error\n";
}

# @{$rss->{items}} に、RSS のすべてのエントリー (item) が入る
foreach my $item ( @{$rss->{items}} ) {

    # ケータイ (iモード) で出力したいので Shift_JIS にする
    my $title       = encode('shiftjis', $item->{title});
    my $description = encode('shiftjis', $item->{description}); # 上に同じ

    print qq|<a href="$item->{link}">$title</a>\n|; # タイトルをリンクつきで出力
    print qq|$description<br />\n|;                 # 概要 (description) を出力
}

exit;

Perl で、文字コードの自動判定をする

たとえば、LWP::UserAgent で取得した RSS (= XML ファイル) の文字コードの自動判定 (エンコーディングの自動判定) を行うには、以下のようにする。
#!/usr/bin/perl

use Encode::Guess;
use LWP::UserAgent;
use HTTP::Request;

my $url = 'https://perltips.twinkle.cc/index.rdf';

my $proxy = new LWP::UserAgent;
my $req   = new HTTP::Request(GET=>$url);
my $res   = $proxy->request($req);
my $xml   = $res->content;
my $enc   = guess_encoding($xml, qw/euc-jp shiftjis 7bit-jis utf8/);
ref($enc) or die "Can't guess: $enc"; # 自動判定に失敗したときのエラー処理
$xml = decode($enc->name, $xml);      # utf8 で保存

...
たとえば、LWP::UserAgent で取得した RSS (= XML ファイル) の文字コードの自動判定 (エンコーディングの自動判定) を行うには、以下のようにする。
#!/usr/bin/perl

use Encode::Guess;
use LWP::UserAgent;
use HTTP::Request;

my $url = 'https://perltips.twinkle.cc/index.rdf';

my $proxy = new LWP::UserAgent;
my $req   = new HTTP::Request(GET=>$url);
my $res   = $proxy->request($req);
my $xml   = $res->content;
my $enc   = guess_encoding($xml, qw/euc-jp shiftjis 7bit-jis utf8/);
ref($enc) or die "Can't guess: $enc"; # 自動判定に失敗したときのエラー処理
$xml = decode($enc->name, $xml);      # utf8 で保存

...

Perl で、住所から緯度経度を取得する方法

Geo::Google モジュールを利用する (米国)。住所を渡せばコーディング的にはほとんど 1行で緯度経度を返してくれる。Google Maps にアクセスしにいって緯度経度を取ってきていてるので、地図データベースは Google Maps のものである。以前紹介した PHP のときのように SOAP も何もいらない (Geo::Google は、内部で LWP::Simple を利用している)。PHP の Geocoder 版は、Geocoder のデータベースに SOAP 経由でアクセスする。少し使ってみた結果、Geocoder のデータベースは少しズレが生じるようである (米国の場合)
use utf8;
use Encode;
use Geo::Google;
use XML::Parser;
#!/usr/bin/perl

use utf8;
use Encode;
use Geo::Google;
use XML::Parser;

my $lng, $lat;
my $address1 = 'your address part 1 here';
my $address2 = 'your address part 2 here';


my ($degree) = getDegrees("$address1 $address2");

if($degree) {

    $lng = $degree->longitude;
    $lat = $degree->latitude;

} else {

    $lng = ''; $lat = '';
}

sub getDegrees {    #  住所から緯度経度を検索

    return $GEO->location( address => Encode::encode_utf8(shift));
                                                        # shift = address / リファレンスを返す
}
Geo::Google モジュールを利用する (米国)。住所を渡せばコーディング的にはほとんど 1行で緯度経度を返してくれる。Google Maps にアクセスしにいって緯度経度を取ってきていてるので、地図データベースは Google Maps のものである。以前紹介した PHP のときのように SOAP も何もいらない (Geo::Google は、内部で LWP::Simple を利用している)。PHP の Geocoder 版は、Geocoder のデータベースに SOAP 経由でアクセスする。少し使ってみた結果、Geocoder のデータベースは少しズレが生じるようである (米国の場合)
use utf8;
use Encode;
use Geo::Google;
use XML::Parser;
#!/usr/bin/perl

use utf8;
use Encode;
use Geo::Google;
use XML::Parser;

my $lng, $lat;
my $address1 = 'your address part 1 here';
my $address2 = 'your address part 2 here';


my ($degree) = getDegrees("$address1 $address2");

if($degree) {

    $lng = $degree->longitude;
    $lat = $degree->latitude;

} else {

    $lng = ''; $lat = '';
}

sub getDegrees {    #  住所から緯度経度を検索

    return $GEO->location( address => Encode::encode_utf8(shift));
                                                        # shift = address / リファレンスを返す
}