【php】SimpleXMLでRSSを取得する
問題
phpでいろんなところからRSSを取ってきて!
答え
RSS2.0なら
$data = array(); $rss = simplexml_load_file('https://www.softel.co.jp/blogs/tech/feed'); foreach ($rss->channel->item as $item) { $x = array(); $x['link'] = (string)$item->link; $x['title'] = (string)$item->title; $x['description'] = (string)$item->description; $x['pubDate'] = (string)$item->pubDate; $data[] = $x; } //確認 var_dump($data);
$item->title などは SimpleXMLElementオブジェクト。その後の処理で文字列として扱うなら、(string)して文字列にキャストする。
$item->description は、内容が <![CDATA[ ~~ ]]> に入っていたりすると、ぱっと見何も取れていないように見えるが、これも(string)してやると内容が取得できる。
RSS1.0なら
$data = array(); $rss = simplexml_load_file('https://www.softel.co.jp/blogs/tech/feed/rdf'); foreach ($rss->item as $item) { $x = array(); $x['link'] = (string)$item->link; $x['title'] = (string)$item->title; $x['description'] = (string)$item->description; $x['pubDate'] = (string)$item->children('http://purl.org/dc/elements/1.1/')->date; $data[] = $x; } //確認 var_dump($data);
記事の日付が名前空間付きの要素(dc:date など)になっていると、そのまま取得できない。
dc:date が取りたいときは、RDFの最初に xmlns:dc=”http://purl.org/dc/elements/1.1/” とあるので、$item->children(‘http://purl.org/dc/elements/1.1/’)->date する。
ATOMなら
$data = array(); $rss = simplexml_load_file('https://www.softel.co.jp/blogs/tech/feed/atom'); foreach ($rss->entry as $item) { $x = array(); $x['link'] = (string)$item->link->attributes()->href; $x['title'] = (string)$item->title; $x['description'] = (string)$item->content; $x['pubDate'] = (string)$item->published; $data[] = $x; } //確認 var_dump($data);
URLがlink要素のhref属性になっているなら、$item->link->attributes()->href;
属性にも名前空間付きのがあるらしいので、そういう場合は、$element->hoge->attributes(‘http://purl.org/syndication/thread/1.0’)->fuga のようにする。
いずれも pubDate として取得した項目は string(31) “Wed, 15 May 2013 00:00:36 +0000” のようになっているので、好きな形式に変えたいときは date(‘Y年m月d日’, strtotime(“Wed, 15 May 2013 00:00:36 +0000”)) する。
コメント