普段、MovableTypeのプラグインでお世話になっている「小粋空間」さんが、意外なところで躓いていた。
以上です。色々調べてこれが最適解と思ったのですが、より適切な解決方法がありましたらコメントください。
「より適切」かどうかは分かりませんが、よりモダンな感じの解決方法を考えてみます。
XML::Simpleで文字化けしない方法の続きを読む
普段、MovableTypeのプラグインでお世話になっている「小粋空間」さんが、意外なところで躓いていた。
以上です。色々調べてこれが最適解と思ったのですが、より適切な解決方法がありましたらコメントください。
「より適切」かどうかは分かりませんが、よりモダンな感じの解決方法を考えてみます。
さっきの記事を書きながら、トピックスの取得だったらRSSで良いよね、と思ってしまったので、ついでに書いてみた。
# utf8
use 5.8.1;
use strict;
use warnings;
use utf8;
use Encode;
use Term::Encoding qw(term_encoding);
my $enc = Encode::find_encoding(term_encoding);
use Data::Feed;
use URI;
# urlを指定する
my $url = URI->new('http://dailynews.yahoo.co.jp/fc/rss.xml');
# サイトにアクセスし、Feedを取得する
my $feed = Data::Feed->parse($url);
print $enc->encode($_->title)."\n" for ($feed->entries);
RSSの解析をするモジュールは色々とあるけれども、今回はData::Feedを使ってみた。
SEE ALSO
「簡単!たった13行のコードでHTML取得&解析をするPerlスクリプト - DQNEO起業日記」が面白そうだったので、コードをコピペしたけど、文字化けしたので、Windowsでも動くように書き直してみた。
かなり行数は増えましたが。
# utf8
# インスパイヤ:[Perl]簡単!たった13行のコードでHTML取得&解析をする - DQNEO起業日記 <http://dqn.sakusakutto.jp/2010/06/perlhtml.html>
use 5.8.1;
use strict;
use warnings;
use utf8;
use Term::Encoding qw(term_encoding);
my $encoding = term_encoding;
binmode STDOUT => ":encoding($encoding)";
use LWP::UserAgent;
use HTML::TreeBuilder;
# urlを指定する
my $url = 'http://yahoo.jp';
# IE8のフリをする
my $user_agent = "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0)";
# LWPを使ってサイトにアクセスし、HTMLの内容を取得する
my $ua = LWP::UserAgent->new(agent => $user_agent);
my $res = $ua->get($url);
my $content = $res->decoded_content;
# HTML::TreeBuilderで解析する
my $tree = HTML::TreeBuilder->new;
$tree->parse($content);
# DOM操作してトピックの部分だけ抜き出す。
# <div id='topicsfb'><ul><li>....の部分を抽出する
my @items = $tree->look_down('id', 'topicsfb')->find('li');
print $_->as_text."\n" for @items;
モダンPerlの記事を読んで、Term::Encodingを知った。
ときには外からどのような入力がくるかわからない場合もありますが,コンソールアプリケーションであれば宮川達彦氏のTerm::Encodingというモジュールを利用すれば標準入出力のエンコーディングを判定できます。
今まで、手動で「cp932」と入力していたのだが、Term::Encodingを使ってやれば自動的に文字コード(エンコーディング)を判別できるではないか、というわけです。
SEE ALSO
| Blog: |
| 日曜プログラマのそゞろ事 |
Topics: |
| Perl |