![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
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ランキング
-
LWP::Simpleでのgetについて
-
【ExcelVBA】commandButtonをク...
-
VBA This Workbookモジュール...
-
pythonのプログラミングについ...
-
モジュールからフォームのボタ...
-
VBAで別モジュールへの変数の受...
-
本当にPublicな変数(配列で)
-
'Range'メソッドは失敗しました
-
現在アクティブなフォーム名を...
-
VBAで「メモリが不足しています」
-
グラフのX,Y座標を取得したい
-
Cygwin インストール Perlを使...
-
CGI.pmはもう古い!?
-
perlからphpに変数の値を渡したい
-
Excel VBAでグローバルな変数は...
-
時間がかかり過ぎたプロセスを...
-
クラスモジュールについて
-
LCD ディスプレイを Raspberry ...
-
cgi(perl)で文中のURLを自動で...
-
VBAでoutlook365が起動しません。
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Perlでgoogle newsのRSSを取得2
-
Web::Scraperの使い方で
-
mechanizeのタイムアウト処理に...
-
VHDLについてですが何がお...
-
PerlのWeb::Scraperと正規表現...
-
Perlで作成したCGIについて
-
Perl/Tk Entry に対して見出し...
-
python wxpythonについて質問です
-
条件分岐によってuseやrequire...
-
TwitterAPI1.1でGetメソッド(...
-
Perl/TkでURLを既定のブラウザ...
-
Perl/TkのWWW::MechanizeのGET...
-
LWP::Simpleでのgetについて
-
Perl LWPでのIPv6エラー
-
perlでhtmlファイルを取得した...
-
perlでのオブジェクト指向の書き方
-
Perl webのテキストボックスに...
-
Win32でInputBoxを実装するには?
-
Perl での XML 処理での DTD 宣...
-
ネストされているRSSのデー...
おすすめ情報