RSS::Parserで要素と文字列を連結する方法

このQ&Aのポイント
  • RSS::Parserを使用して取り出した要素と文字列を連結する方法について教えてください。
  • サンプルコードを改造した際にエラーが発生し、要素の連結方法がわからなくなってしまいました。
  • 最終的には要素をHTML形式で連結し、変数に格納したいです。
回答を見る
  • ベストアンサー

RSS::Parserで取り出した要素と文字列の連結

以下のサンプルを改造し ----------------------------------------------------- ENTRIES = 5 require 'uri' require 'open-uri' require 'rss' uri = URI.parse('http://b.hatena.ne.jp/entrylist?mode=rss&sort=hot&threshold=3') rss = RSS::Parser.parse(uri.read) rss.output_encoding = 'Shift_JIS' bookmarks = [] rss.items.each do |i| bookmarks.push([i.title, i.link]) end puts "■はてなブックマーク 最近の注目エントリ #{ENTRIES}件" puts puts bookmarks[0, ENTRIES].map {|i| i.join("\n") }.join("\n\n") ----------------------------------------------------- rdfファイルを加工するスクリプトを作成してみましたが エラーが出てしまいます。 エラーメッセージ ----------------------------------------------------- rss.rb:27: undefined method `join' for "Sun, 25 Jan 2009 02:51:06 +0900":String (NoMethodError) from rss.rb:26:in `each' from rss.rb:26 ----------------------------------------------------- サンプルを改造したもの ----------------------------------------------------- ENTRIES = 5 require 'uri' require 'open-uri' require 'rss' uri = URI.parse('honyarara.rdf') rss = RSS::Parser.parse(uri.read) rss.output_encoding = 'Shift_JIS' titles = [] links = [] dates = []#空の配列を生成 rssdata = "" rss.items.each do |i| titles.push([i.title])#pushは配列に要素を加えると言う意味 links.push([i.link]) dates.push([i.date]) end puts "\n\n" for i in 0...5 rssdata += dates[i].join("<a href='").join(links[i]).join("'>").join(titles[i]).join("</a>").join("\n") end puts "\n\n" puts rssdata ----------------------------------------------------- ほかに【.join】の部分を【+】にしてみたり 色々試してみましたがうまくいきませんでした。 rdfの要素を取り出しHTML形式で書き出したいのですが 【↓このような形にして変数に格納したい】 ----------------------------------------------------- 2009/10/17<a href="​http://foo.bar.com/article/2">​使い方難しい。</a>\n 2009/10/18<a href="​http://foo.bar.com/article/3">​使い方難しい2。</a> ----------------------------------------------------- rdfの要素と文字列の連結方法がわかりません。 宜しくお願いします。

  • Ruby
  • 回答数2
  • ありがとう数7

質問者が選んだベストアンサー

  • ベストアンサー
  • notnot
  • ベストアンサー率47% (4848/10262)
回答No.2

Rubyは型(オブジェクトのクラス)に厳しい言語なので、演算子・メソッドにデータを渡すときには型がなんであるかを意識しないといけません。 ライブラリのメソッドが返すオブジェクト型についてはドキュメントに記述があるはずです。もし無い場合は、puts xxxx.class などを挿入してみてクラス名を確認します。 修正点は下記。 rss.items.each do |i|   titles.push(i.title)#pushは配列に要素を加えると言う意味   links.push(i.link)   dates.push(i.date.strftime("%Y/%m/%d")) end

swqplnndc
質問者

お礼

ご回答ありがとうございます! ご指摘の通り修正したらすんなりできました。 初歩的なことで、恐縮です。 puts xxxx.class ↑このメソッドで確認したところ (i.link):String ([i.link]):Array i.date:Time と確認できました! ありがとうございます! 勉強になりました!

その他の回答 (1)

  • notnot
  • ベストアンサー率47% (4848/10262)
回答No.1

joinは、StringからなるArrayをつなぎ合わせてStringにするメソッドなので、あなたがしようとしている用途には合いません。 Stringを繋ぎたいみたいなので、+ で良さそうですが。 >【+】にしてみたり色々試してみましたがうまくいきませんでした。 どのように書いてどのようになったのですか?

swqplnndc
質問者

お礼

早速のご回答ありがとうございます! >どのように書いてどのようになったのですか? 以下のようにしてみました。 ------------------------------------------- # -* coding: Shift_JIS -*- ENTRIES = 5 require 'uri' require 'open-uri' require 'rss' uri = URI.parse('http://dtm-web-etc.seesaa.net/index20.rdf') rss = RSS::Parser.parse(uri.read) rss.output_encoding = 'Shift_JIS' titles = [] links = [] dates = []#空の配列を生成 rssdata = "" rss.items.each do |i| titles.push([i.title])#pushは配列に要素を加えると言う意味 links.push([i.link]) dates.push([i.date]) end puts "\n\n" for i in 0...5 rssdata += (dates[i]) + ("<a href='") + (links[i]) + ("'>") + (titles[i]) + ("</a>") + ("\n") end puts "\n\n" puts rssdata ------------------------------------------- エラーメッセージです。 ------------------------------------------- 27:in `+': can't convert String into Array (TypeError) from rss.rb:27 from rss.rb:26:in `each' from rss.rb:26 ------------------------------------------- rdfから取り出したdates[i]などの値は 文字列ではないということでしょうか? 初歩的な質問でお手数をおかけしますが ヒントがありましたら是非お願い致します。

関連するQ&A

  • Ruby RSSの文字置換について

    RubyでRSSリーダーを作成しているのですが、 読み込んだRSSのエンコード(utf-8)とプログラムのエンコード(cp932)が異なるため、 エラーが発生しました。 <プログラム> ------------------------------------------------------- # encoding: cp932 require 'open-uri' require 'rss' xml = nil open("http://codezine.jp/rss/new/20/index.xml") { |http|    xml = http.read } rss = RSS::Parser.parse(xml.force_encoding("utf-8")) puts "#{rss.channel.title.encode('cp932', 'utf-8')}"\ + "#{rss.channel.pubDate.strftime("%Y/%m/%d %X")}" rss.items.each do |item|    puts '--------------------------'    puts item.title.encode('cp932', 'utf-8')    puts item.pubDate.strftime("%Y/%m/%d %X")    puts item.description.encode('cp932', 'utf-8') end ------------------------------------------------------ <エラーメッセージ> ------------------------------------------------------ rss_r.rb:18:in `encode': U+2013 from UTF-8 to Windows-31J (Encoding::UndefinedConversionError) ------------------------------------------------------ 以下のサイトを参考にして文字を置換しようと思ったのですが、 http://qiita.com/yugo-yamamoto/items/0c12488447cb8c2fc018 rssはStringクラスではないため、trメソッドが使えません。 どのようにすれば文字を置換できるのか教えていただけますでしょうか。

    • ベストアンサー
    • Ruby
  • レスポンスを早くしたい。(python)

    レスポンスを早くしたい。(python) google app engine/pythonを利用してまとめのまとめサイトを作成しているのですが、レスポンスにかなり時間がかかってしまいます。 rssをただ上書きでページに表示するのではなく、過去に配信された記事(このrss配列に保存した日から)は全て保存しておきたいです。 恐らく下記関数の部分が重いと思うのですが、なんとか改善することはできないでしょうか? ※全角スペースでインデントしています。 from google.appengine.ext import webapp from google.appengine.ext import db from google.appengine.ext.webapp import template from google.appengine.ext.webapp.util import run_wsgi_app import os import cgi import math import datetime import feedparser def Rss():  rss = [ ["http://hoge1.com/index.rdf",u"サイト名1","http://hoge1.com/"], ["http://hoge2.com/index.rdf",u"サイト名2","http://hoge2.com/"], ["http://hoge3.com/index.rdf",u"サイト名3","http://hoge3.com/"], ["http://hoge4.com/index.rdf",u"サイト名4","http://hoge4.com/"], ["http://hoge5.com/index.rdf",u"サイト名5","http://hoge5.com/"], ["http://hoge6.com/index.rdf",u"サイト名6","http://hoge6.com/"]]  for r in range(len(rss)):   f = feedparser.parse(rss[r][0])   results = Nich.all().filter('site_url =', rss[r][2]).order('-date').fetch(limit=1)   if results:    for i in range(0,len(f.entries)):     date = datetime.datetime.strptime(f.entries[i].updated,'%Y-%m-%dT%H:%M:%S+09:00')     for result in results:      if result.date < date:       nich = Nich()       nich.e_title = f.entries[i].title       nich.e_body = f.entries[i].summary.replace('\n',' ')       nich.e_url = f.entries[i].links[0].href       nich.site = rss[r][1]       nich.site_url = rss[r][2]       nich.hit = 0;       nich.date = date       nich.put()   else:    for i in range(0,len(f.entries)):     date = datetime.datetime.strptime(f.entries[i].updated,'%Y-%m-%dT%H:%M:%S+09:00')     nich = Nich()     nich.e_title = f.entries[i].title     nich.e_body = f.entries[i].summary.replace('\n',' ')     nich.e_url = f.entries[i].links[0].href     nich.site = rss[r][1]     nich.site_url = rss[r][2]     nich.hit = 0;     nich.date = date     nich.put() 現在、ダッシュボードのAvg CPU (API)という項目が、平均して4000(3000)という状態です。赤文字です。 意味不明な部分があれば言ってくださればすぐに補足しますので、どうか宜しくお願いします。

    • ベストアンサー
    • CGI
  • PerlでRSS取得 ~ 文字化け ~ utf8→ShifJIS変換できない

    XML::RSSを使用してRSSのタイトルを取得するPerlスクリプトを作っています。 DBCSの場合、文字化けするので、以下のようにfrom_toを使用してutf8をShiftJISに変換しようとしましたが、エラーが出ます。 SBCSでは問題無いのですが。 Encode::Guessで調べるとutf8が返ってくるので、「from_to( $title, 'utf8','shiftjis' )」でutf8をShift-JISに変換すればよいのかと思ったのですが。 ■環境 ・perl v5.8.3 built for MSWin32-x86-multi-thread ・Windows2000(SP4) ■エラーメッセージ Cannot decode string with wide characters at c:/Perl/lib/Encode.pm line 184. ■ソース #!/usr/bin/perl BEGIN { use CGI::Carp qw(carpout fatalsToBrowser); carpout(STDOUT); } use Encode qw/ from_to /; use LWP::Simple 'get'; use XML::RSS ; print"Content-type: text/html\n\n"; print"<HTML>\n"; print"<HEAD><meta http-equiv=\"Content-Type\" content=\"text/html;charset=Shift-JIS\"></HEAD>\n"; print"<BODY>\n"; my $rss = new XML::RSS; eval {   # $rss->parse( get('http://slashdot.org/slashdot.rdf') );    $rss->parse( get('http://oshiete1.goo.ne.jp/rss/oshiete_goo.xml') ); }; exit if $@; foreach my $ref( @{$rss->{items}} ) {   $title = $ref->{'title'};   $link = $ref->{'link'};   from_to( $title, 'utf8','shiftjis' );   print"[title] $title<br>\n";   print"[link] <a href=\"$link\" target=\"_blank\">$link</a><br>\n";   ----------------------------<br><br>\n"; } print"</BODY></HTML>\n"; RSSの取得方法はここを参考にしました。 http://www.rfs.jp/sb/perl/10/rss01.html 宜しくお願いします。

    • ベストアンサー
    • Perl
  • 配列をputsで表示させる順番

    お尋ねします。 2016/01/04, 11, 101 2016/01/05, 12, 102 2016/01/06, 13, 103 と表示させようと思い下記を作ってみましたが、どうしても 2016/01/04, 2016/01/05, 2016/01/04, 11, 12, 13, 101, 102, 103 となってしまいます。(出力の順番と改行の問題)どのようにすればよいでしょうか? [0..2].each do |i| puts [stock.dates[i], stock.num1[i], stock.num2[i]].join(", ") end よろしくお願いします。

    • ベストアンサー
    • Ruby
  • MagpieRSSを使ってrss取得の際の表示件数

    MagpieRSSを使ってrssを取得したく下記のphpを作成しました。 <?php define('MAGPIE_OUTPUT_ENCODING','UTF-8'); require_once('rss_fetch.inc'); $url="xxxx.rdf"; $rss = fetch_rss($url); foreach($rss->items as $item){ foreach($item[dc] as $key => $daytime){ if($key == "date"){ $rssdate = strtotime("$daytime"); $today = strtotime(date("Y/m/d H:i")); } if($rssdate > $today){ print("$item[title]"); } } } ?> 過去から未来の予定が書いてあるRSS(rdf)があり、 現在の時間のデータを取得して、未来の予定のを表示したいです。 現在、print("$item[title]");で未来の予定がズラっと取得できる状態です。 そして、ここからが問題なのですが、 ここ(print("$item[title]");)の表示を最新の1件にしたいのですが、どうしてもうまくいきません。 ご教授お願いします。

    • ベストアンサー
    • PHP
  • 【Ruby】改行挿入 文字列操作

    以下の様な文字列を <div>xxx</div>yy<span>zzz</span> 以下の様に編集したいです。 <div>xxx</div> yy <span>zzz</span> htmlのタグ毎に改行を挿入したいのです。 もしも上記例でyyがなければ以下の様に書くのですが、 require 'drb/drb' puts DATA.read.scan(/(<.+?>.+?<\/.+?>)/).join("\n") __END__ <div>xxx</div>yy<span>zzz</span> 以上、よろしくご指導の程、お願い申し上げます。

    • ベストアンサー
    • Ruby
  • Data::Dumper;でダンプ後表示した文字列\x{30fc}...

    お世話になります。 下記のスクリプトを使ってrssファイル内をuse Data::Dumper;でダンプして表示してみたのですが、rssファイルがutf8で記述されているせいか 表示時に日本語の所が\x{30fc}のような文字列になってしまいます。 これをshiftjisで表示させたいのですが、試行錯誤してもうまくいきません。 どなたかご教授いただけませんでしょうか。 #!/usr/bin/perl BEGIN{ $| = 1; print "Content-type: text/html\n\n"; open(STDERR, ">&STDOUT"); } use XML::RSS; use Data::Dumper; my $rss = new XML::RSS; #表示形式の違いで1と2がある。 $Data::Dumper::Indent = 1; use open IN => ":utf8"; # 入力をUTF8とする use open OUT => ":shiftjis"; #use open ":std"; #use Encode; #use encoding 'shiftjis', STDIN=>'utf8', STDOUT=>'sjis'; #binmode STDOUT, ":encoding(utf-8)"; #binmode STDOUT, ":encoding(shiftjis)"; #binmode STDOUT, ":encoding(euc-jp)"; #use open ":encoding(shiftjis)"; # rssをセット。 open my $fh, '< ./test.rss'; my $text = join undef, <$fh>; close $fh; # rssをパース $rss->parse($text); # ひとまず中見を知る為にダンプしてみる print "Content-type:text/html;charset=Shift_JIS\n\n"; print "<html><head>\n"; print "<title></title></head>\n"; print "<body>\n"; print Data::Dumper->Dump([$rss]);

    • ベストアンサー
    • Perl
  • RSSの格納、表示がうまくいかない

    データベースへの接続は完了したんですが、RSSの格納がうまくいきません。 エラー文も表示されず原因がわからないのですが、おかしな文はありますでしょうか? <?php require_once(dirname(dirname(dirname(dirname( __FILE__ )))) . '/wp-load.php' ); //ファイルの先頭で読み込む try { $dsn = 'mysql:dbname=hlxclitx_wp1;host=localhost'; $user = 'hlxclitx_wp1'; $password = 'E.HrypHWxNmltXgC5eS26'; $dbh = new PDO($dsn,$user,$password); $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);//エラーが発生した時に、例外を投げる echo "データベースへの接続が出来ました"; }catch (PDOException $e) { echo $e->getMessage();// err時はメッセージを表示 exit; } $url1 = [ 'http://blog.livedoor.jp/dqnplus/index.rdf', 'http://alfalfalfa.com/index.rdf', 'http://himasoku.com/index.rdf',]; //itemを取り出して$rssに渡す $date = $rss->channel->date; // RSSアイテム取得 値の代入 自作関数 //SQL文を実行、結果を求める $stmt = $dbh->prepare('insert into hlxclitx_feed_rss (data) values (?)'); //$url1配列から先頭のデータをとりだして$urlに渡す なくなるまでループする foreach ($url1 as $url) { //rssがほしいから、もらった$urlを渡す if (($rss = @simplexml_load_file($url)) === false) continue; // RSSタイトルがほしいから、もらったrssを渡す $site_title = $rss->channel->title; //初期のカウント $count = 0; //itemを取り出して$rssに渡す ループ foreach ($rss->item as $item) { //8件を超えたとき取得を終了する if (++$count > 8) break; //タイトル、リンクを取得 $title = $item->title; $link = $item->link; //RSSの情報を取得 $dc = $item->children('http://purl.org/dc/elements/1.1/'); //RSS日付け取得 $date = date('Y-m-d H:i:s', strtotime($dc->date)); // $title, $link, $date を表示 $stmt->execute[json_encode($item)]; } } ?> 補足情報(FW/ツールのバージョンなど) db name hlxclitx_wp1 table name hlxclitx_feed_rss テーブル名 (data) 名前 item

    • ベストアンサー
    • PHP
  • jacascriptでサイトにRSSフィードを表示した際の文字制限につ

    jacascriptでサイトにRSSフィードを表示した際の文字制限について 以下jacascriptでサイトにRSSフィードを表示してます。 google.load("feeds", "1"); function initialize() { var feed = new google.feeds.Feed("http://xxxxxxxxxxxxx.rdf"); feed.setNumEntries(5); feed.load(function(result) { if (!result.error) { var container = document.getElementById("feed"); for (var i = 0; i < result.feed.entries.length; i++) { var entry = result.feed.entries[i]; var dd = new Date(entry.publishedDate); // now var yearNum = dd.getYear(); if (yearNum < 2000) yearNum += 1900; var m = dd.getMonth() + 1; if (m < 10) {m = "0" + m;} var d = dd.getDate(); if (d < 10) {d = "0" + d;} var date = yearNum + "-" + m + "-" + d + " "; container.innerHTML += "<p>" + "<span>" + date + "</span>"+ "&nbsp;<a href='" + entry.link + "' target='_blank'>" + entry.title.substr(0,15) + "</a></p>"; } } }); } google.setOnLoadCallback(initialize); 表示する文字数をsubstr(0,15)で制限しているのですが、15文字以上はタイトルの右に「…」を付加させたいのですが、どのようにすればよいのでしょうか?

  • RSSを取得したいのですが

    下記サイトを参考に、以下のコードを埋め込んだのですが、 http://plaza.rakuten.co.jp/kemusiro/diary/200601150000/ 日付が (1970/01/01 00:00:00) と表示された上に文字化けしてしまいます。 MagpieRSSはmagpierss-0.72.tar.gzから必要ファイルを、index.phpの下におきました。 正常に表示させるためには、どう直せばよいでしょうか? <?php require_once('magpierss/rss_fetch.inc'); define('MAGPIE_OUTPUT_ENCODING', 'UTF-8'); $count = 5; $length = 60; $url = 'http://api.plaza.rakuten.ne.jp/kemusiro/rss/'; $rss = fetch_rss($url); echo "<ul>"; array_splice($rss->items, $count); foreach ($rss->items as $item) { $href = $item['link']; $title = mb_convert_encoding($item['title'], "SJIS", "auto"); $date = date('Y/m/d H:i:s', parse_w3cdtf($item['dc']['date'])); $description = mb_convert_encoding($item['description'], "SJIS", "auto"); if (mb_strlen($description) > $length) { $description = mb_strcut($description, 0, $length) . "..."; } echo "<li>"; echo "<FONT color=\"#ff8040\">(" . $date . ")</FONT> "; echo "<a href=$href>" . $title . "</a><BR>"; echo $description . "</li>"; } echo "</ul>"; ?>

    • 締切済み
    • PHP

専門家に質問してみよう