RSSからデータ取り出しについて、ご教授ください。
use XML::RSS;
をperlに実装して、RSSファイルを分解し、必要なデータだけ取り出すスクリプトを使用しています。
データがとれなくなったので、ソースを調べたところ、配布元が改造をしたらしく
<rss version="2.0">
<channel>
<title>RSSによる順位公開</title>
<item>
<title>タイトル1</title>
<rank>1</rank>
<preranks>
<rank>3</rank>
</preranks>
</item>
<item>
<title>タイトル2</title>
<rank>2</rank>
<preranks>
<rank>10</rank>
</preranks>
</item>
のようになっていました。
<rank> はそのときのタイトルの表示ランキングで、<preranks>は、RSSが更新される以前の表示ランキングを示しています。
ちなみに、preranks からネストしている rank を別の表記にしたり、ネストしない構造に変更することは、対応できないとの回答でした。
$rss->parse( RSSのURL );
for (@{$rss->{'items'}}) {
$el00 = $_->{title};
$el01 = $_->{rank};
}
と実行すると、$el00は、タイトル1 や タイトル2 と希望通りの形に分解できるのですが、$el01 は 13 や 210 など、<preranks> の内側の <rank> と並べた数字で表示されてしまいます。
といって、 $el01 = $_->{preranks}; でも数字がとれません。
こうした構造のRSSで、<rank> と <preranks> をデータとして分解するには、どんな記述をしたらいいのでしょうか?
よろしくご教授お願いします。
A 回答 (1件)
- 最新から表示
- 回答順に表示
No.1
- 回答日時:
XML::RSSモジュールを使って試してみましたが、パースがうまくいかないですね。
XML::RSSモジュールにこだわらなくていいのなら、XML::XPathモジュールを使えば、下記のようなスクリプトでパースができると思います。
#!/usr/bin/env perl
use v5.16;
use warnings;
use utf8;
use open IO => qw/:utf8 :std/;
use autodie;
use XML::XPath;
my $string = << 'EOF';
<?xml version="1.0" encoding="utf-8" ?>
<rss version="2.0">
<channel>
<title>RSSによる順位公開</title>
<item>
<title>タイトル1</title>
<rank>1</rank>
<preranks>
<rank>3</rank>
</preranks>
</item>
<item>
<title>タイトル2</title>
<rank>2</rank>
<preranks>
<rank>10</rank>
</preranks>
</item>
</channel>
</rss>
EOF
my $xpath = XML::XPath->new(xml => $string);
for my $item ($xpath->findnodes('//item'))
{
say 'タイトル:', $item->findvalue('title');
say '新ランク:', $item->findvalue('rank');
say '旧ランク:', $item->findvalue('preranks/rank');
}
実行結果は下記のとおりとなります。
タイトル:タイトル1
新ランク:1
旧ランク:3
タイトル:タイトル2
新ランク:2
旧ランク:10
XPathは一度覚えちゃえば、いろいろな場面で活用できます。
表示させたいところを細かく指定できるのが便利です。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Perl RSSにdiv,ul classを付けたいのですがどのようにつけるのかわからないです 2 2022/03/28 01:53
- PHP 【スプレッドシート】順位のつけ方 2 2022/08/17 13:27
- 数学 線形代数 正則 階数 3 2023/03/22 07:52
- Visual Basic(VBA) 3つのプロシージャをまとめたら実行時エラー発生で対応不能 6 2022/05/17 01:47
- JavaScript 【jquery】EasyUIのSubGridにMySQLのテーブルデータを表示&編集にしたい 5 2022/05/02 13:10
- gooブログ gooブログについて 1 2022/05/09 09:46
- 教えて!goo RSSについて 1 2022/08/17 15:15
- PHP アコーディオンPHPが上手くいかない 3 2022/07/15 16:29
- 大学・短大 | 1 -2 -2c+1| |2| A=| 2 -1 -c+2 | b=|2| | 1 -c+2 2 2 2023/05/14 21:42
- Excel(エクセル) エクセルでの勤務表作成、インターバルの設定について 3 2022/06/03 15:35
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
PerlのモジュールにWWW::Mechan...
-
LCD ディスプレイを Raspberry ...
-
VBAでoutlook365が起動しません。
-
Excel VBA 定義されたプロージ...
-
Excel VBAで、ユーザーフォーム...
-
「デバイスは PRN を初期化でき...
-
ArduinoのジャイロモジュールMP...
-
Excel VBA 標準モジュール内で...
-
エクセルVBAでシートモジュール...
-
VBAで別モジュールへの変数の受...
-
VBAで2重のDoLoop関数から抜け...
-
BASP21使用のメール送信でコマ...
-
VBAのバージョン管理
-
GOSUB命令とは
-
CGI::Carpを使っているのにInte...
-
Excel VBAで、ユーザーフォー...
-
pythonでファイル移動できません。
-
Excel VBA 『Call』で呼び出す...
-
現在アクティブなフォーム名を...
-
Ctrl+Vのキーストロークを合成...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Perl 強制終了の回避について
-
Win32でInputBoxを実装するには?
-
VHDLについてですが何がお...
-
Perl/TkでURLを既定のブラウザ...
-
LWPでHTMLが取得できないことが...
-
Perl LWPでのIPv6エラー
-
LWP::Simpleでのgetについて
-
mechanizeのタイムアウト処理に...
-
TwitterAPI1.1でGetメソッド(...
-
Excel VBAでリンク切れをチェッ...
-
Excel VBA 定義されたプロージ...
-
例外処理のフローチャートの記...
-
ArduinoのジャイロモジュールMP...
-
ユーザー定義関数に#NAME?が返...
-
「デバイスは PRN を初期化でき...
-
VBAで別モジュールへの変数の受...
-
Excel VBA 『Call』で呼び出す...
-
エクセルVBAでシートモジュール...
-
LCD ディスプレイを Raspberry ...
-
モジュールとは何ですか
おすすめ情報